我正在尝试将我的xpath设置为仅定位页面文本内容,但是文章“关于作者”的部分仍然包含在内,我希望xpath仅针对文章文本+标题。
到目前为止我的xpath:
//*[@class="content"]//p[not(contains(@id, "author-bio"))] |
//*[@id="content_wrapper"]//h1
这样可行,但不会按预期删除有关作者部分的内容。我正在处理下面的文章。
我正在使用firefox / firebug的firepath扩展,它允许我查看我定位的元素。
答案 0 :(得分:1)
该特定文档是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']
技巧。
答案 1 :(得分:0)
id('home_right_column')// p [not(ancestor :: [@ id ='author-bio'])] | // [@ ID = “content_wrapper”] // H1
自己动手:)