使用XPath进行灵活的文本检索

时间:2015-12-11 17:14:52

标签: html xml xpath

我有一堆HTML文本流,每个都包含短语" Toy:"一次。

如,

<p><b>Toy: </b><b>Train</b></p>
<p><b>Toy:</b><b>Chess game</b></p>
<p><b>Toy: </b><span>Guitar</span></p>
<p><b>Toy: </b>Doll</p>
<p><strong><ul>Toy: </ul></strong></b><b>Monkey costume</b></p>
<p><b>Toy: Train</b></p>
<p>Toy: Skipping rope</p>
<p>Toy:Snail</p>

我想从中删除这些文字。

例如,

Toy: Train
Toy:Chess game
Toy: Guitar
Toy: Doll
Toy: Monkey costume
Toy: Train
Toy: Skipping rope
Toy:Snail

我无法找到一个我认为应该可行的单个xpath表达式。

示例:

//p[starts-with(descendant-or-self::*/text(), "%s")]

1 个答案:

答案 0 :(得分:2)

首先,XPath需要格式良好的XML:

<root>
  <p><b>Toy: </b><b>Train</b></p>
  <p><b>Toy:</b><b>Chess game</b></p>
  <p><b>Toy: </b><span>Guitar</span></p>
  <p><b>Toy: </b>Doll</p>
  <p><strong><ul>Toy: </ul></strong><b>Monkey costume</b></p>
  <p><b>Toy: Train</b></p>
  <p>Toy: Skipping rope</p>
  <p>Toy:Snail</p>
</root>

然后,您可以选择以p开头的所有Toy:元素:

//p[starts-with(., 'Toy:')]
  

我想从这些文本中删除文本。

在纯 XPath 1.0 中,您可以执行

//p[starts-with(., 'Toy:')]//text()

检索以p开头的Toy:元素下的文本节点,但每个文本节点字符串将在其自己的行上,而不是按封闭p分组。

要将文本分组在每个封闭的p下,您可以单步执行选定的p元素,并使用您用于评估XPath的任何托管语言获取每个元素的字符串值,或者您可以使用 XPath 2.0

//p[starts-with(., 'Toy:')]/string()

将返回

Toy: Train
Toy:Chess game
Toy: Guitar
Toy: Doll
Toy: Train
Toy: Skipping rope
Toy:Snail