XPath 测试工具

你的文档和表达式仅保留在此浏览器中。

粘贴不超过 1,000,000 个字符的 XML 或 HTML。求值使用 XPath 1.0,在此浏览器中完成。

支持绝对或相对的 XPath 1.0 表达式。文档中声明的前缀会自动注册;默认命名空间可通过前缀 d 使用。

为网页爬取或 XSLT 编写 XPath 时,如果没有一个实时沙盒,就只能反复猜测和试错。这个测试工具在一个窗格里接收你的 XML 或 HTML,在另一个窗格里接收你的表达式,用浏览器自带的引擎对 XPath 1.0 求值,并列出每个匹配节点的类型、属性、文本内容和序列化标记。像 count(//book) 这样的标量表达式会直接返回其值,文档中声明的命名空间前缀也会自动注册。一切都在你的浏览器中运行:文档不会被上传。

如何测试 XPath 表达式

  1. 1

    粘贴 XML 或 HTML

    自动检测在看到 HTML 的 doctype 或根元素时会切换到宽松的 HTML 解析;你也可以强制使用 XML 或 HTML 模式。

  2. 2

    输入你的 XPath

    绝对路径(`/library/book`)或相对路径(`//div[@class='card']`),任何 XPath 1.0 表达式都可以。

  3. 3

    求值

    查询由浏览器自带的 XPath 引擎在本地运行,不会向服务器发送任何内容。

  4. 4

    查看结果

    每个匹配项显示节点类型、属性、修剪后的文本和序列化标记;最多列出 200 个匹配。

XPath 1.0 要点

表达式 匹配内容
/books/book 根元素 <books> 下的 <book> 子元素
//book 文档中任意位置的所有 <book>
//book[@id='42'] id 属性等于 42 的 <book>
//book[1] 每个父元素下的第一个 <book>(并非全文档)
(//book)[1] 整份文档中的第一个 <book>
//book[title='1984'] <title> 文本为 “1984” 的 <book>
//book/@id 所有 <book> 元素的 id 属性
//book[position() > 1] 除第一个之外的所有 <book>
//book[last()] 每个父元素下的最后一个 <book>

标量表达式同样可用:count(//book) 返回数字,string(//title) 返回字符串,boolean(//book[@id]) 返回 true 或 false。测试工具会直接显示这些值,而不是节点列表。

child 之外的常用轴

  • ancestor:::所有祖先节点
  • following-sibling:::当前节点之后的兄弟节点
  • preceding-sibling:::当前节点之前的兄弟节点
  • descendant:::所有后代节点
  • attribute::(简写 @):当前节点的属性
  • parent::(简写 ..):父元素

HTML 的特殊之处

HTML 不是严格的 XML,因此测试工具会用浏览器的 HTML 解析器对它做宽松解析,而不是用严格的 XML 解析器。HTML 模式会根据 <!DOCTYPE html><html> 根元素自动检测,你也可以用选择器强制指定任一模式。在 HTML 模式下,标签名和属性名会被转成小写,所以 XPath 要用小写来写:应写 //div[@class],而不是 //DIV[@CLASS]

命名空间

带命名空间的 XML 需要注册前缀:

<rss xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <item>
    <content:encoded>...</content:encoded>
  </item>
</rss>

测试工具会扫描文档中的 xmlns 声明并自动注册每个前缀,因此 //content:encoded 可以直接使用。默认命名空间(不带前缀的 xmlns="...")在文档中没有前缀,测试工具会把它绑定到前缀 d:在使用默认命名空间的订阅源中,用 //d:item 即可选中 <item>。已注册的绑定会列在结果旁边。

这个测试工具不支持的表达式

浏览器求值的是 XPath 1.0,也就是大多数爬取技术栈使用的方言。XPath 2.0 及之后版本的特性,例如 matches(string, regex)tokenize(string, delimiter)for ... return 表达式和序列运算符,都不属于这个方言;它们出现在 XSLT 2.0/3.0 工具链中。对网页爬取来说,XPath 1.0 仍然是可移植性最好的选择。

测试小贴士

  • 先宽后窄。 先用 //div,再用 //div[@class],最后加上具体的 class 值。
  • 检查命名空间声明。 大多数“为什么我的 XPath 什么都没返回?”的问题都出在命名空间上;看看已注册前缀的列表。
  • 注意大小写。 XML 区分大小写,而 HTML 模式会把名称转成小写。
  • 提取文本时试试 string()。 存在嵌套标记时,//p/text()string(//p) 的结果并不相同。

常见问题

不支持,只支持 XPath。大多数浏览器两者都提供:document.querySelectorAll(CSS)和 document.evaluate(XPath)。哪种对当前任务更清晰就用哪种。

HTML 解析会把标签名和属性名转成小写。请确保 XPath 使用小写:应写 //div[@class] 而不是 //DIV[@CLASS]。另外请检查模式:对不规范的 HTML 强制使用 XML 模式会因解析错误而失败,而 HTML 模式会做宽松解析。

文档中声明的前缀会自动注册,可直接在表达式中使用。默认命名空间会被绑定到前缀 d,因此在使用默认命名空间的文档中,//d:item 可以选中 <item> 元素。当前生效的绑定会随结果一起列出。

不会。文档和表达式都由浏览器自带的 XPath 引擎求值,不会发送到我们的服务器,不会被存储,也不会添加到页面地址中;它们只保留在当前浏览器会话里,以便分步视图能够展示你的结果。

相关工具