【问题标题】:HtmlAgilityPack Not Finding Specific Node That Should Be ThereHtmlAgilityPack 未找到应该存在的特定节点
【发布时间】:2019-10-05 00:11:15
【问题描述】:

我正在加载一个 URL,并且正在寻找一个应该存在于 HTML 文档中的特定节点,但它每次都返回 null。事实上,我试图找到的每个节点都返回 null。我在其他网页上使用过相同的代码,但由于某种原因,在这种情况下它不起作用。 HtmlDoc 加载的内容是否与我在浏览器中看到的源代码不同?

我显然是网络抓取的新手,但我曾多次遇到此类问题,因为我无法选择可以在浏览器中看到的节点,因此我必须制定详细的解决方法。我的处理方式有什么根本错误吗?

string[] arr = { "abercrombie", "adt" };
for(int i=0;i<1;i++)
{
      string url = @"https://www.google.com/search?rlz=1C1CHBF_enCA834CA834&ei=lsfeXKqsCKOzggf9ub3ICg&q=" + arr[i] + "+ticker" + "&oq=abercrombie+ticker&gs_l=psy-ab.3..35i39j0j0i22i30l2.102876.105833..106007...0.0..0.134.1388.9j5......0....1..gws-wiz.......0i71j0i67j0i131j0i131i67j0i20i263j0i10j0i22i10i30.3zqfY4KZsOg";
      HtmlWeb web = new HtmlWeb();
      var htmlDoc = web.Load(url);
      var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'HfMth']");
      Console.WriteLine(node.InnerHtml);
}

更新

感谢 RobertBaron 为我指明了正确的方向。这是一个很棒的复制粘贴solution

【问题讨论】:

    标签: c# html web-scraping webbrowser-control html-agility-pack


    【解决方案1】:

    您尝试抓取的页面具有运行以加载页面的全部内容的 javascript 代码。因为您的浏览器运行该 javascript,所以您可以看到页面的全部内容。 HtmlWeb.Load() 不运行任何 javascript 代码,因此您只能看到部分页面。

    您可以使用WebBrowser 控件来抓取该页面。就像您的浏览器一样,它将运行任何 javascript 代码,并且将加载整个页面。有几篇堆栈溢出文章展示了如何做到这一点。以下是其中一些。

    【讨论】:

    • 抱歉耽搁了。是的,这正是我想要的。谢谢。
    【解决方案2】:

    该内容是动态添加的,不会出现在通过您当前的方法 + url 返回的内容中;这就是为什么您的 xpath 不成功的原因。您可以检查返回的内容,例如:

    var node = htmlDoc.DocumentNode.SelectSingleNode("//*");
    

    为您的第一个网址选择存在的内容 - 以显示您可以选择一个节点

    var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'st']");
    

    您可以使用开发者工具 > 网络选项卡 > 查看您所追求的任何特定动态内容是否可通过单独的 xhr 请求 url 获得。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多