使用 xpath 从 html 中提取嵌套文本
Extracting nested text from html using xpath
我正在尝试从看起来像这样的 html 页面中提取文本内容:
<div class="content">
<div class="section">
Lorem <a href="..." class="link">ipsum</a>
dolor <a href="..." class="link">sit</a> amet,
consectetur <a href="..." class="link">adipiscing</a> elit
</div>
<div class="section">
sed do <a href="..." class="link">eiusmod</a> tempor
incididunt <a href="..." class="link">ut</a> labore
et <a href="..." class="link">dolore</a>
</div>
</div>
我只想提取文本部分:
Lorem ipsum dolor amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
我的 XPath (2.0) 表达式是 //*[contains(@class, 'section')]
。当我使用 javax.xml.xpath.XPathExpression
评估它时,我只检索链接之外的文本:
Lorem dolor amet, consectetur elit, sed do tempor incididunt labore et
我以前没有用过XPath - 有没有更好的表达式来提取全文?谢谢。
您的表达式 returns 是一个完整的 XML 元素。然后你的处理器通过将 XML 元素转换为文本 returns 作为字符串,所以基本上与你执行的相同
//*[contains(@class, 'section')]/text()
相比之下,您可以使用 string()
函数获取子项中的所有文本元素:
//*[contains(@class, 'section')]/string()
正如 Mathias Müller 在评论中指出的,另一种方法是使用
//*[contains(@class, 'section')]//text()
其中 returns 所有后代或自身文本元素。
我正在尝试从看起来像这样的 html 页面中提取文本内容:
<div class="content">
<div class="section">
Lorem <a href="..." class="link">ipsum</a>
dolor <a href="..." class="link">sit</a> amet,
consectetur <a href="..." class="link">adipiscing</a> elit
</div>
<div class="section">
sed do <a href="..." class="link">eiusmod</a> tempor
incididunt <a href="..." class="link">ut</a> labore
et <a href="..." class="link">dolore</a>
</div>
</div>
我只想提取文本部分:
Lorem ipsum dolor amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
我的 XPath (2.0) 表达式是 //*[contains(@class, 'section')]
。当我使用 javax.xml.xpath.XPathExpression
评估它时,我只检索链接之外的文本:
Lorem dolor amet, consectetur elit, sed do tempor incididunt labore et
我以前没有用过XPath - 有没有更好的表达式来提取全文?谢谢。
您的表达式 returns 是一个完整的 XML 元素。然后你的处理器通过将 XML 元素转换为文本 returns 作为字符串,所以基本上与你执行的相同
//*[contains(@class, 'section')]/text()
相比之下,您可以使用 string()
函数获取子项中的所有文本元素:
//*[contains(@class, 'section')]/string()
正如 Mathias Müller 在评论中指出的,另一种方法是使用
//*[contains(@class, 'section')]//text()
其中 returns 所有后代或自身文本元素。