Xpath定位网站文本

时间:2013-11-07 11:57:22

标签: html xpath

我正在尝试将我的xpath设置为仅定位页面文本内容,但是文章“关于作者”的部分仍然包含在内,我希望xpath仅针对文章文本+标题。

到目前为止

我的xpath:

//*[@class="content"]//p[not(contains(@id, "author-bio"))] |
//*[@id="content_wrapper"]//h1

这样可行,但不会按预期删除有关作者部分的内容。我正在处理下面的文章。

http://www.intomobile.com/2013/11/05/samsung-galaxy-s3-android-43-update-rolling-out-international-users/

我正在使用firefox / firebug的firepath扩展,它允许我查看我定位的元素。

2 个答案:

答案 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

自己动手:)