【问题标题】:Get Proper XPath for SelectNodes为 SelectNode 获取正确的 XPath
【发布时间】:2016-05-29 22:00:18
【问题描述】:

我刚开始使用 HtmlAgilityPack 从网站上抓取一些文本。我进行了实验,发现在使用 SelectNodes 方法时,某些网站比其他网站更容易获得正确的 XPath。我相信我做错了什么,但无法弄清楚。

例如,在 Google Chrome 中探索 DOM 时,我可以复制 XPath://*[@id="page"]/span/table[7]/tbody/tr[1]/td/span[2]/a 然后我会做类似的事情。

var search = doc.DocumentNode.SelectNodes("//[@id=\"page\"]//span//table//tr//td//span//a"foreach loop 中使用search 时,我得到一个空引用错误,并且调试器说search 是空的。所以我假设 XPath 是错误的..(或者我正在做其他完全错误的事情)所以我的问题是我究竟如何为 HtmlAgilityPack 找到正确的 XPath 来找到这些节点?

【问题讨论】:

  • 我想我能够弄清楚.. xpath 包含在 iframe 中。
  • 请注意,您可以使用支持 css 选择器的扩展,例如 ScrapySharp,以及 HtmlAgilityPack,并且您将能够使用 css 而不是 xpath,如果这样更容易你(对我来说确实如此,因为我已经熟悉 css 但不熟悉 xpath)。此外,AngleSharp 是类似于 HtmlAgilityPack 的解析器,但提供了对 css 选择器的内置支持,无需其他包。
  • @Veverke 我会看看你的建议。谢谢楼主!
  • @Veverke 你知道有一个库可以从当前页面的 iFrame 中抓取数据吗?我已经测试了 ScrapySharp,它更容易(再次感谢)但是就像 HtmlAgilityPack 一样,它不适用于页面上的直接 iframe 源。只有当我自己抓取 iframe 源 url 时它才会起作用。
  • 您要解析的网站是什么?我可以看看。但是,如果 iframe 由 javascript 加载或在 html 中动态加载 - 它在请求响应时确实不可用,因此单独解析将无济于事。 AngleSharp - 我认为能够在呈现最终的 html 文档之前处理 javascript - 但我还不能让它为我工作。

标签: c# xpath html-agility-pack


【解决方案1】:

跟进您在上一条评论中的要求,只有在 http get 请求返回后,html 才会完全呈现。

几个 javascript 调用将 html 块插入到文档中。

你想要它们中的以下:loadCompanyProfileData('ContactInfo'),它会生成一个如下所示的 http get 请求:

http://financials.morningstar.com/cmpind/company-profile/component.action?component=ContactInfo&t=XNAS:AAPL&region=usa&culture=en-US&cur=&_=1465809033745

这将返回电子邮件,您可以使用如下代码提取该电子邮件: HtmlWeb w = new HtmlWeb(); var doc = w.Load("http://financials.morningstar.com/cmpind/company-profile/component.action?component=ContactInfo&t=XNAS:AAPL&region=usa&culture=en-US&cur=&_=1465809033745");

        var emails = doc.DocumentNode.CssSelect("a")
            .Where(a => a.GetAttributeValue("href")
                .StartsWith("mailto:"))
                .Select(a => a.GetAttributeValue("href")
                    .Replace("mailto:", string.Empty));

电子邮件最终包含 1 个元素,即investor_relations@apple.com。

您的问题是确定 loadCompanyProfileData javascript 函数用于每个不同公司的“cur”参数应该是什么。

我无法在代码中找到此参数的生成位置/方式。 一种替代方法是执行浏览器模拟器(如 selenium web driver port for c#),这样您就可以执行 javascript 代码 - 并针对每个公司请求运行对 loadCompanyProfileData('ContactInfo') 的调用。

但我无法让它正常工作,我的网络驱动器脚本执行看起来不工作。

【讨论】:

  • 感谢您花时间为我解释这个!
  • 许多其他人在这里为我做了同样的事情,我只是(试图)回馈;)
  • 您是如何获得答案中提供的链接的?我还需要其他东西,但我想自己弄清楚。您是通过在 Chrome 或 Firefox 中检查元素源得到的吗?我能够获得“financials.morningstar.com/cmpind/company-profile/component.action?component="+component+"&t=XNAS:AAPL&region=usa&culture=en-US&cur="
  • 鼠标右键单击页面任意位置,然后选择查看源代码。
猜你喜欢
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 2019-09-12
  • 2021-08-08
  • 1970-01-01
  • 2021-12-25
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多