XPath表达式:选择元素节点之间的文本节点

时间:2016-09-15 06:26:08

标签: xpath textnode

基于以下HTML,我想提取TextA,TextC和TextE。

<div id='content'>
    TextA
    <br/>
    <br/>
    <p>TextB</p>
    TextC
    <br/>
    TextC
    <p>TextD</p>
    TextE
</div>

我试图像这样得到TextC,但我没有得到我想要的结果:

  • 查询:
    //*[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]]
  • 预期结果:
    ["TextC", <br/>, "TextC"]
  • 实际结果:
    [<br/>]

有没有办法在不使用//div/text()[1]等索引的情况下选择文本节点?

1 个答案:

答案 0 :(得分:2)

两个文本节点不在XPath结果中的原因是因为*仅匹配元素。要匹配元素和文本节点,您可以改为使用node()

//node()[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]]

<强> Demo

或者,如果您只想获取文本节点,即排除<br/>,则可以使用text()代替node()

//text()[preceding::p[contains(.,"TextB")] and following::p[contains(.,"TextD")]]