为什么我的HtmlAgilityPack代码适用于某些网站而不适用于其他网站?

时间:2014-02-14 22:03:16

标签: c# dom screen-scraping html-agility-pack wikipedia

使用下面的代码,我可以从维基百科获得段落,但不能获得古腾堡:

private void buttonLoadHTML_Click(object sender, EventArgs e)
{
    string url = textBoxFirstURL.Text;
    GetParagraphsListFromHtml(url);
}

public List<string> GetParagraphsListFromHtml(string sourceHtml)
{
    var pars = new List<string>();
    var getHtmlWeb = new HtmlWeb();
    var document = getHtmlWeb.Load(sourceHtml);
    var pTags = document.DocumentNode.SelectNodes("//p");
    if (pTags != null)
    {
        foreach (var pTag in pTags)
        {
            if (!string.IsNullOrWhiteSpace(pTag.InnerText))
            {
                pars.Add(pTag.InnerText);
                MessageBox.Show(pTag.InnerText);
            }
        }
    }
    MessageBox.Show("done!");
    return pars;
}

如果我在textBoxFirstURL中输入“http://en.wikipedia.org/wiki/Web_api”,它将按预期工作:段落显示在一系列MessageBox调用中。但是,如果我输入http://www.gutenberg.org/files/19033/19033-h/19033-h.htm,我会得到:

enter image description here

为什么会出现这种情况,有没有办法解决它?

更新

所谓的相同问题不仅是相同的问题,它没有答案,所以该陈述(“这个问题可能已经在这里得到答案”)不是真的,或者至少是误导性的

1 个答案:

答案 0 :(得分:2)

Project Gutenberg会将您重定向到“欢迎陌生人”页面,如果它不能识别您之前曾在那里。据推测,这是通过使用cookie。因此,除非您的代码在执行过程中维护cookie集合,否则您将被重定向到该页面。

这是我在点击您的链接http://www.gutenberg.org/ebooks/19033?msg=welcome_stranger

时重定向到的页面

如果您查看该页面的来源,您会看到其中只有一个段落标记,其中包含您在屏幕截图中显示的文字。

您还会注意到,在页面顶部的评论中,您会看到以下声明:

  

请勿使用此页面进行清理。

     

严重。你只能阻止你的IP。

     

请改为下载http://www.gutenberg.org/feeds/catalog.rdf.bz2   在一个RDF / XML文件中包含所有项目Gutenberg元数据。