【问题标题】:XPath Query Problem using HTML Agility Pack使用 HTML Agility Pack 的 XPath 查询问题
【发布时间】:2011-08-24 06:03:45
【问题描述】:

我正在尝试使用 HTML Agility Pack 从this website 中抓取价格字段。

我的代码如下;

var web = new HtmlWeb();
var doc = web.Load(String.Format(overClockersURL, componentID));
var priceContent = doc.DocumentNode.SelectSingleNode("//*[@id=\"prodprice\"]");

我通过使用 Firebug 的“Copy as XPath”功能获得了 XPath 查询。

我遇到的问题是 SelectSingleNode 正在返回 null - 它似乎没有找到查询指定的元素。我有点不明白为什么,但我对 XPath 没有太多经验,所以希望能得到一些关于我做错了什么的指点。

【问题讨论】:

  • 当空集合更好时,HTML 敏捷包返回 null 让我很恼火。您是否尝试过尝试 XPath 并用已知元素名称替换“*”,例如如果您知道有一个 id 为“prodprice”的 div 将“*”替换为“div”以查看是否得到不同的结果?
  • 抱歉,必须在最后一条评论中添加空格才能显示星号,因为它会将它们解释为斜体标记的开始/结束。
  • 嗨@Colin Mackay:我试过“//span[@id='prodprice']”,但结果相同-返回null:S
  • @Oscar Mederos:这正是正在发生的事情 - 感谢您的建议。如果您将评论移至答案,那么我可以将其标记为已接受的解决方案。

标签: c# xpath html-agility-pack


【解决方案1】:

如果我运行这段代码:

    var web = new HtmlWeb();
    var doc = web.Load("http://www.overclockers.co.uk/showproduct.php?prodid=GX-033-HS");
    var priceContent = doc.DocumentNode.SelectSingleNode("//*[@id=\"prodprice\"]");
    Console.WriteLine("price=" + priceContent.InnerHtml);

它输出:

price=529.99

所以它似乎正在工作。您也可以使用//span[@id=\"prodprice\"]",这样会更好,因为它可以避免所有非 SPAN 标签。

【讨论】:

  • 嗨@Simon Mourier - 您正在运行什么版本的HTML Agility Pack?我正在使用当前的稳定版本 1.4.0.0,并且在上面运行您的代码会导致 priceContent 对我来说为空。
  • @C.McAtackney - 我正在运行 1.3.0.0 - 我写的那个 :-)
  • 您需要获取最新版本;)我想我可能知道发生了什么; HtmlWeb.Load 如何与代理交互?它会默认使用系统设置,还是需要做一些额外的事情才能通过系统代理路由请求?
【解决方案2】:

发生这种情况时,您应该检查页面是否正确加载(您说您是通过 HTTP 代理?)

尝试将doc.DocumentNode.OuterHtml 的内容写入文本文件,以便查看页面是否正确加载。也许您得到的是错误页面而不是原始页面。

【讨论】:

  • 再次感谢 Oscar 的建议 - 结果我只是收到一个错误页面,因为我没有明确指定在我的系统设置中设置的代理。之后(通过 Load 方法的重载之一),一切都按预期工作。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2011-11-25
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多