0

我在使用 Chrome 提供给我的一些 XPath 时遇到问题。我现在尝试使用的示例位于http://magic.tcgplayer.com/db/magic_single_card.asp?cn=Jace,%20Memory%20Adept

我试图用页面顶部的蓝色背景来隔离价格。Chrome说xpath是

//*[="inputForm"]/table[1]/tbody/tr[1]/td/div/table/tbody/tr/td[5]/center/b

并基于此,我试图通过这样做来创建一个带有价格金额的字符串:

var baseNode = document.DocumentNode.SelectSingleNode("//*[=\"inputForm\"]//table[1]//tbody//tr[1]//td//div//table//tbody//tr//td[5]//center//b");
String price = baseNode.InnerText;

哪个与消息一起崩溃

你调用的对象是空的。

我不确定在这里做什么,我可以使用一些帮助。谢谢!

4

2 回答 2

0

大多数情况下,您无法获取浏览器调试工具(Chrome、FF 等)提供的 XPATH 并在 Html Agility Pack 等工具中使用它。

原因是浏览器为您提供了内存中元素的 XPATH,而 Html Agility Pack 将从源 HTML 流中看到 XPATH。

两个 XPATH 表达式之间最常见的差异是浏览器添加的元素;例如 TBODY。TBODY 很少在 HTML 文件中定义,但总是由浏览器添加。所以你可以试试这个:

//*[="inputForm"]/table[1]/tr[1]/td/div/table/tr/td[5]/center/b

但我当然不保证它会起作用。最好的办法是让人类查看源 HTML,并提出一个很好的判别(和未来容忍)XPATH 表达式,例如:

//myElement[@class='someclass']

意思是“获取所有具有‘class’属性的‘myElement’标签,其值为‘someclass’。

我们可以在 HTML 源代码和您想要获取的元素方面提供更多帮助。

编辑:要在您提供的 url 中以蓝色显示价格,如果您快速查看它,您会看到判别式正是颜色,因此您可以想象这样的 XPATH:

//td[@bgcolor='#D1DFFC']//b

威奇的意思:

  1. 从根 (/)
  2. 递归获取文档中的任何 TD 元素(double / 表示递归),其 BGCOLOR 属性的值等于“#D1DFFC”
  3. 从该 TD 中递归查找并搜索 B 元素。

所以像这样的 C# 代码:

        HtmlDocument doc = new HtmlDocument();
        doc.Load(yourHtmlFile);

        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td[@bgcolor='#D1DFFC']//b"))
        {
            Console.WriteLine(node.InnerHtml);
        }

将显示

$17.91
于 2013-01-13T17:18:32.153 回答
0

检查xpathify / untemplate工具。两者都生成非常兼容(和人类可读)的 XPath 查询:

射击

于 2013-01-13T23:45:02.763 回答