从网站读取特定文本
Reading Specific text from a website
我正在尝试创建一个数据库,但我需要从网站获取信息。主要是 IMDB 网站上的标题、日期、长度和类型。我已经尝试了 50 种不同的方法,但都没有用。
这是我的代码。
public string GetName(string URL)
{
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(URL);
var Attr = doc.DocumentNode.SelectNodes("//*[@id=\"overview - top\"]/h1/span[1]@itemprop")[0];
return Name;
}
当我 运行 这只是给我一个 XPathException。我只希望它成为 return 电影的标题。我现在只是将这部电影用作示例和测试,但我希望它适用于所有电影 http://www.imdb.com/title/tt0405422
我正在使用 HtmlAgilityPack。
我做了一些熟悉的事情,这是我从 imdb.com 网站获取信息的代码。:
string html = getUrlData(imdbUrl + "combined");
Id = match(@"<link rel=""canonical"" href=""http://www.imdb.com/title/(tt\d{7})/combined"" />", html);
if (!string.IsNullOrEmpty(Id))
{
status = true;
Title = match(@"<title>(IMDb \- )*(.*?) \(.*?</title>", html, 2);
OriginalTitle = match(@"title-extra"">(.*?)<", html);
Year = match(@"<title>.*?\(.*?(\d{4}).*?\).*?</title>", html);
Rating = match(@"<b>(\d.\d)/10</b>", html);
Genres = matchAll(@"<a.*?>(.*?)</a>", match(@"Genre.?:(.*?)(</div>|See more)", html));
Directors = matchAll(@"<td valign=""top""><a.*?href=""/name/.*?/"">(.*?)</a>", match(@"Directed by</a></h5>(.*?)</table>", html));
Cast = matchAll(@"<td class=""nm""><a.*?href=""/name/.*?/"".*?>(.*?)</a>", match(@"<h3>Cast</h3>(.*?)</table>", html));
Plot = match(@"Plot:</h5>.*?<div class=""info-content"">(.*?)(<a|</div)", html);
Runtime = match(@"Runtime:</h5><div class=""info-content"">(\d{1,4}) min[\s]*.*?</div>", html);
Languages = matchAll(@"<a.*?>(.*?)</a>", match(@"Language.?:(.*?)(</div>|>.?and )", html));
Countries = matchAll(@"<a.*?>(.*?)</a>", match(@"Country:(.*?)(</div>|>.?and )", html));
Poster = match(@"<div class=""photo"">.*?<a name=""poster"".*?><img.*?src=""(.*?)"".*?</div>", html);
if (!string.IsNullOrEmpty(Poster) && Poster.IndexOf("media-imdb.com") > 0)
{
Poster = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY200.jpg");
PosterLarge = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY500.jpg");
PosterFull = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY0.jpg");
}
else
{
Poster = string.Empty;
PosterLarge = string.Empty;
PosterFull = string.Empty;
}
ImdbURL = "http://www.imdb.com/title/" + Id + "/";
if (GetExtraInfo)
{
string plotHtml = getUrlData(imdbUrl + "plotsummary");
}
//Match single instance
private string match(string regex, string html, int i = 1)
{
return new Regex(regex, RegexOptions.Multiline).Match(html).Groups[i].Value.Trim();
}
//Match all instances and return as ArrayList
private ArrayList matchAll(string regex, string html, int i = 1)
{
ArrayList list = new ArrayList();
foreach (Match m in new Regex(regex, RegexOptions.Multiline).Matches(html))
list.Add(m.Groups[i].Value.Trim());
return list;
}
也许你会发现一些有用的东西
您的 XPath 的最后一位无效。另外,要仅从 HtmlDocument()
获取单个元素,您可以使用 SelectSingleNode()
而不是 SelectNodes()
:
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://www.imdb.com/title/tt0405422/");
var xpath = "//*[@id='overview-top']/h1/span[@class='itemprop']";
var span = doc.DocumentNode.SelectSingleNode(xpath);
var title = span.InnerText;
Console.WriteLine(title);
输出:
The 40-Year-Old Virgin
演示 link : *
https://dotnetfiddle.net/P7U5A7
*) 演示显示打印了正确的标题,以及特定于 .NET 的错误 Fiddle(您可以安全地忽略该错误)。
我正在尝试创建一个数据库,但我需要从网站获取信息。主要是 IMDB 网站上的标题、日期、长度和类型。我已经尝试了 50 种不同的方法,但都没有用。 这是我的代码。
public string GetName(string URL)
{
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(URL);
var Attr = doc.DocumentNode.SelectNodes("//*[@id=\"overview - top\"]/h1/span[1]@itemprop")[0];
return Name;
}
当我 运行 这只是给我一个 XPathException。我只希望它成为 return 电影的标题。我现在只是将这部电影用作示例和测试,但我希望它适用于所有电影 http://www.imdb.com/title/tt0405422 我正在使用 HtmlAgilityPack。
我做了一些熟悉的事情,这是我从 imdb.com 网站获取信息的代码。:
string html = getUrlData(imdbUrl + "combined");
Id = match(@"<link rel=""canonical"" href=""http://www.imdb.com/title/(tt\d{7})/combined"" />", html);
if (!string.IsNullOrEmpty(Id))
{
status = true;
Title = match(@"<title>(IMDb \- )*(.*?) \(.*?</title>", html, 2);
OriginalTitle = match(@"title-extra"">(.*?)<", html);
Year = match(@"<title>.*?\(.*?(\d{4}).*?\).*?</title>", html);
Rating = match(@"<b>(\d.\d)/10</b>", html);
Genres = matchAll(@"<a.*?>(.*?)</a>", match(@"Genre.?:(.*?)(</div>|See more)", html));
Directors = matchAll(@"<td valign=""top""><a.*?href=""/name/.*?/"">(.*?)</a>", match(@"Directed by</a></h5>(.*?)</table>", html));
Cast = matchAll(@"<td class=""nm""><a.*?href=""/name/.*?/"".*?>(.*?)</a>", match(@"<h3>Cast</h3>(.*?)</table>", html));
Plot = match(@"Plot:</h5>.*?<div class=""info-content"">(.*?)(<a|</div)", html);
Runtime = match(@"Runtime:</h5><div class=""info-content"">(\d{1,4}) min[\s]*.*?</div>", html);
Languages = matchAll(@"<a.*?>(.*?)</a>", match(@"Language.?:(.*?)(</div>|>.?and )", html));
Countries = matchAll(@"<a.*?>(.*?)</a>", match(@"Country:(.*?)(</div>|>.?and )", html));
Poster = match(@"<div class=""photo"">.*?<a name=""poster"".*?><img.*?src=""(.*?)"".*?</div>", html);
if (!string.IsNullOrEmpty(Poster) && Poster.IndexOf("media-imdb.com") > 0)
{
Poster = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY200.jpg");
PosterLarge = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY500.jpg");
PosterFull = Regex.Replace(Poster, @"_V1.*?.jpg", "_V1._SY0.jpg");
}
else
{
Poster = string.Empty;
PosterLarge = string.Empty;
PosterFull = string.Empty;
}
ImdbURL = "http://www.imdb.com/title/" + Id + "/";
if (GetExtraInfo)
{
string plotHtml = getUrlData(imdbUrl + "plotsummary");
}
//Match single instance
private string match(string regex, string html, int i = 1)
{
return new Regex(regex, RegexOptions.Multiline).Match(html).Groups[i].Value.Trim();
}
//Match all instances and return as ArrayList
private ArrayList matchAll(string regex, string html, int i = 1)
{
ArrayList list = new ArrayList();
foreach (Match m in new Regex(regex, RegexOptions.Multiline).Matches(html))
list.Add(m.Groups[i].Value.Trim());
return list;
}
也许你会发现一些有用的东西
您的 XPath 的最后一位无效。另外,要仅从 HtmlDocument()
获取单个元素,您可以使用 SelectSingleNode()
而不是 SelectNodes()
:
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://www.imdb.com/title/tt0405422/");
var xpath = "//*[@id='overview-top']/h1/span[@class='itemprop']";
var span = doc.DocumentNode.SelectSingleNode(xpath);
var title = span.InnerText;
Console.WriteLine(title);
输出:
The 40-Year-Old Virgin
演示 link : *
https://dotnetfiddle.net/P7U5A7
*) 演示显示打印了正确的标题,以及特定于 .NET 的错误 Fiddle(您可以安全地忽略该错误)。