章节摘要:XPath 表达式只有接到求值器上才算完成。本章把同一条
/bookstore/book[@category='web']/title接到 Python lxml、Java XPathFactory、浏览器 evaluate,以及抓取与编辑工具。然后用具体对比说明为何//是性能第一嫌疑,以及可移植性、空结果排查这些最佳实践。合并原文的应用场景与最佳实践,避免单独开空节。
阅读完本章,你应当能够:
金句:表达式可移植,求值器不可假定——先问版本,再问返回类型。

Python lxml 与标准库 ElementTree 的能力差、Java 的返回类型、C# PHP 的入口。原文集用 Java 查出全部 title 文本以及 web 类书名。
开发者工具、页面自动化、编辑器里的 XPath 求值。应用场景并入:配置抽取、RSS、测试定位。CSS 选择器够用时不必上 XPath。
少用 //、谓词前移、缓存编译后的表达式、命名空间一次注册。空结果三步排查回链第 1 章。
先接通语言,再接通人用的工具,最后才谈快和稳。没接通就优化是空谈。
4.1 语言 API ──► 4.2 工具与场景 ──► 4.3 性能与纪律
本章故意把性能放在最后。没接到求值器上,讨论 // 扫了多少节点没有意义。4.1 先把同一条 web 类书名路径接到 lxml 和 Java,并强调返回类型:要列表就声明节点集,声明成字符串往往只拿到第一本。原文集的 Java 示例用字符串类型取 web 书名,样本里 web 只有一本时碰巧正确,四本样本就会丢书。
4.2 把人从 IDE 拉到浏览器和抓取配置。复制生成的绝对长链带一串位置谓词,广告插入一个块,后面全部错位。正确姿势是先选卡片容器,再对每张卡片用相对短路径。CSS 能稳定命中时不必上 XPath;需要父轴或文本 contains 时再请它。
| 节 | 接通对象 | 过关标准 |
|---|---|---|
| 4.1 | lxml 与 Java 工厂 | 能说出节点集和字符串返回的差别 |
| 4.2 | 浏览器与抓取字段 | 不再把绝对链贴进生产 |
| 4.3 | 表达式形状与纪律 | 能把双斜杠收成三级 child 链 |
4.3 的清单可以当代码评审表:循环里是否每次编译、用户输入有没有拼进路径、空结果有没有先摘掉谓词看 count。硬件和换引擎是最后手段。XML 配置、RSS、SOAP 响应、测试定位这些场景并进 4.2,不再单独开一节罗列行业名词。
接通语言时差的不是斜杠写法,是返回类型、解析器和命名空间注册。Java 默认字符串类型会把三本书名砍成第一本,原文集 web 书名示例在只有一本 web 时碰巧对。HTML 解析补 tbody、浏览器 HTML 落在 XHTML 空间,都会让「源码里抄的路径」变空。这些不是 XPath 语法倒退,是树变了。先打印树,再写路径。
抓取字段不要贴开发者工具生成的绝对长链。先选卡片,再相对取标题。CSS 能稳就用 CSS。性能上能立刻改的是收双斜杠、谓词前移、编译放循环外。用户输入禁止拼进路径。空结果先摘谓词看 count。把这些写成评审问题,比单独背「最佳实践」章节有用。硬件和换引擎放最后。
本章合并了原文的应用场景:配置、RSS、SOAP、测试定位,都是树已经在那。JSON 文本不是树,1.0 路径怼不了。动态页面空经常是还没渲染,路径不会帮你等。把等待写成更多双斜杠只会更脆。读完应当能把同一条 web 类书名路径在一种语言里跑通,并说出另一种语言要注意的返回类型。
本章把同一条选出网络类书名的路径接到语言和工具上,差的不是斜杠怎么写,而是返回类型、解析器补出来的树、以及护照怎么注册。字符串返回会把四本书名砍成第一本,四本夹具里网络类有两本时就能揭穿这种碰巧。页面会补表格身体、元素可能落进另一套空间,源码里抄的绝对链会空。抓取先选卡片再取标题,复制来的带位置编号的长链只当草稿。性能先少看节点,把铺开全体收成三级链,编译放循环外,用户输入禁止拼进路径。空了先摘筛选看大小。配置、订阅源、报文是干净树;对象记法文本不是树;动态空常常是还没画出来。读完应当能在一种语言里跑通同一条路径,并说出另一种语言要注意的返回类型。
语言接通的验收不要只看「能跑」。把同一条选出网络类书名的路径在两种求值器上跑,把打印出来的书名并排:本数必须相同,顺序按文档序。少一本先查返回类型,多一本先查解析器有没有把推荐栏或补全节点加进树。三件事——解析选项、返回类型、命名空间表——不定,同一条路径在两种语言里对不上号,看起来像斜杠写错。验收过了再谈循环外编译。