我一直在玩HtmlAgilityPack一段时间,但是我遇到了关于创建新HtmlDocument的问题。我有一个简单的程序,可以获取特定列表中的电影数据。一些信息在列表页面上检索,其余信息在每个项目的链接页面上检索。
我遇到的问题是,每次我希望从链接页面检索信息时,我都在创建一个新的HtmlDocument。当我尝试检索完整的电影列表时,程序只会挂在控制台窗口上。这是我的代码:
namespace ConsoleApplication5
{
public class Scraper
{
private string _baseUrl = @"http://www.imdb.com";
private string _startingUrl = @"http://www.imdb.com/chart/top";
private HtmlWeb _webGet = new HtmlWeb();
public string StartingUrl
{
get { return _startingUrl; }
}
public string BaseUrl
{
get { return _baseUrl; }
}
public HtmlWeb WebGet
{
get { return _webGet; }
}
public List<Film> GetFilmData()
{
var allFilmData = new List<Film>();
var doc = WebGet.Load(StartingUrl);
var allFilmsInTable = doc.DocumentNode.SelectNodes("//div[@id='main']/table/tr");
foreach (var line in allFilmsInTable)
{
if (line.PreviousSibling != null)
{
var film = new Film();
film.Title = line.SelectSingleNode(".//td/font/a").InnerHtml;
film.Url = BaseUrl + line.SelectSingleNode(".//td/font/a").Attributes["href"].Value;
film.Rating = Convert.ToDecimal(line.SelectSingleNode(".//td[@align='center']/font").InnerText);
film.RankInTop250 = Convert.ToInt32(line.SelectSingleNode(".//td[@align='right']/font/b").InnerText.Replace(".",string.Empty));
allFilmData.Add(SingleFilmInformation(film));
}
}
return allFilmData;
}
public Film SingleFilmInformation(Film film)
{
var singleDoc = WebGet.Load(film.Url);
film.ReleaseYear = Convert.ToInt32(singleDoc.DocumentNode.SelectSingleNode("//h1[@class='header']/span/a").InnerText);
film.Director = singleDoc.DocumentNode.SelectSingleNode("//div[@itemprop='director']/a/span").InnerText;
foreach (var genre in singleDoc.DocumentNode.SelectNodes("//div[@class='infobar']/a/span[@itemprop='genre']"))
{
film.Genres.Add(genre.InnerText);
}
return film;
}
}
非常感谢任何帮助。