该特定文档是 XHTML,它的根元素为
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"
xmlns:og="http://opengraphprotocol.org/schema/"
xmlns:fb="http://www.facebook.com/2008/fbml">
这xmlns="..."
意味着html
元素(及其所有不带前缀的后代)在http://www.w3.org/1999/xhtml
命名空间中。现在 XPath 表达式中的无前缀名称指的是不在命名空间中的节点,所以
//p[not(contains(@id, "author-bio"))]
正在寻找p
在没有命名空间中命名的元素,并且不会匹配命名空间p
中http://www.w3.org/1999/xhtml
命名的元素。
正确的方法是将前缀映射到该名称空间 URI 并在 XPath 表达式中使用前缀,例如
//xhtml:p[not(contains(@id, "author-bio"))]
但究竟如何定义前缀映射取决于您使用的 XPath 引擎。如果您的工具没有提供进行前缀映射的方法,那么您必须在 上使用谓词local-name()
,例如
//*[local-name() = 'p'][not(contains(@id, "author-bio"))]
这同样适用于h1
,您需要绑定并使用前缀或使用*[local-name() = 'h1']
技巧。