如何选择元素背后的文字?

时间:2015-02-23 17:12:51

标签: bash xpath xmllint

我有以下xmllint示例选择元素:

$ curl -s http://lists.opencsw.org/pipermail/users/2015-January/date.html |
xmllint --html --xpath '/html/body/p/b[contains(., "Messages:")]' -
<b>Messages:</b>

粗体元素后面是我感兴趣的消息数量。当我使用parent轴时显示:

$ curl -s http://lists.opencsw.org/pipermail/users/2015-January/date.html |
xmllint --html --xpath '/html/body/p/b[contains(., "Messages:")]/parent::*' -
<p><b>Starting:</b> <i>Thu Jan  1 23:17:09 CET 2015</i><br><b>Ending:</b> <i>Sat Jan 31 14:51:07 CET 2015</i><br><b>Messages:</b> 28</p>

我认为following-sibling轴可能会给我这个数字,但它没有这样做:

$ curl -s http://lists.opencsw.org/pipermail/users/2015-January/date.html |
xmllint --html --xpath '/html/body/p/b[contains(., "Messages:")]/following-sibling::*' -
XPath set is empty

1 个答案:

答案 0 :(得分:2)

您所追求的此文本节点确实是以下兄弟节点,但它是 text 节点,而不是元素节点。像

这样的表达式
following-sibling::*

仅查找以下元素的兄弟姐妹。要匹配文本节点,请使用text()

$ curl -s http://lists.opencsw.org/pipermail/users/2015-January/date.html |
xmllint --html --xpath '/html/body/p/b[contains(., "Messages:")]/following-sibling::text()'

上面的命令在Mac OS X上使用bash在我的计算机上不起作用 - 但我相信它对你有用。如果我先从curl保存结果,然后使用

$ xmllint example.html --html --xpath '/html/body/p/b[contains(., "Messages:")]/following-sibling::text()'

结果是_28。这不是一个真正的下划线,而是一个我想指出的空白。要删除前导空格,请使用

$ xmllint example.html --html --xpath 'normalize-space(/html/body/p/b[contains(., "Messages:")]/following-sibling::text())'

不,使用正则表达式不是一个真正的选择。