HtmlAgilityPack - 加载多个页面

时间:2013-08-25 08:52:18

标签: c# html-agility-pack

我一直在玩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;
    }
}

非常感谢任何帮助。

0 个答案:

没有答案