XPath 测试工具
XML 或 HTML 文档
粘贴不超过 1,000,000 个字符的 XML 或 HTML。求值使用 XPath 1.0,在此浏览器中完成。
支持绝对或相对的 XPath 1.0 表达式。文档中声明的前缀会自动注册;默认命名空间可通过前缀 d 使用。
为网页爬取或 XSLT 编写 XPath 时,如果没有一个实时沙盒,就只能反复猜测和试错。这个测试工具在一个窗格里接收你的 XML 或 HTML,在另一个窗格里接收你的表达式,用浏览器自带的引擎对 XPath 1.0 求值,并列出每个匹配节点的类型、属性、文本内容和序列化标记。像 count(//book) 这样的标量表达式会直接返回其值,文档中声明的命名空间前缀也会自动注册。一切都在你的浏览器中运行:文档不会被上传。
如何测试 XPath 表达式
-
1
粘贴 XML 或 HTML
自动检测在看到 HTML 的 doctype 或根元素时会切换到宽松的 HTML 解析;你也可以强制使用 XML 或 HTML 模式。
-
2
输入你的 XPath
绝对路径(`/library/book`)或相对路径(`//div[@class='card']`),任何 XPath 1.0 表达式都可以。
-
3
求值
查询由浏览器自带的 XPath 引擎在本地运行,不会向服务器发送任何内容。
-
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 引擎求值,不会发送到我们的服务器,不会被存储,也不会添加到页面地址中;它们只保留在当前浏览器会话里,以便分步视图能够展示你的结果。
相关工具
BBCode 转 HTML 转换器
将 BBCode(论坛标记)转换为干净的 HTML。支持格式标签、列表、引用、代码、图片和链接。
电话号码验证器
根据各国号码规划检查结构,并显示地区、类型以及E.164、国际、国内和RFC 3966格式。
布尔代数化简器
使用 Karnaugh 图和 Quine-McCluskey 算法化简布尔表达式。显示每一步最小化过程以及最终 SOP/POS 形式。
二进制转 ASCII 转换器
粘贴二进制(用空格分隔的字节或一长串比特),即可得到它所表示的 ASCII 文本。支持 7 位和 8 位编码。
随机颜色生成器
生成 1 到 50 个随机 HEX 颜色,查看色块,复制代码,并用于 CSS、测试或配色探索。
ASCII 转十六进制转换器
将 ASCII 文本转换为十六进制字节值。输出每个字符占两位十六进制,可直接用于内存转储、数据包跟踪或固件表。