我可以使用什么XPath来获取第一段节点之后的所有文本节点?

时间:2013-04-07 19:23:01

标签: ruby xpath nokogiri

我是Nokogiri和Ruby的新手。

我想获取文档中所有节点的文本,从第一段节点开始并包含第一段节点。

我尝试了以下XPath,但我无处可去:

 puts page.search("//p[0]/text()[next-sibling::node()]")

这不起作用。我需要改变什么?

2 个答案:

答案 0 :(得分:4)

您必须找到<p/>节点并返回内部和后续的所有text()节点。根据Nokogiri的XPath功能,使用以下查询之一:

//p[1]/(descendant::text() | following::text())

如果它不起作用,请使用它,这需要找到第一段两次,可能有点,但可能不明显,慢:

(//p[1]/descendant::text() | //p[1]/following::text())

可能不受支持的XPath 2.0替代方案是:

//text()[//p[1] << .]

表示“所有文本节点前面都有文档”中的第一个<p/>节点。

答案 1 :(得分:2)

这适用于Nokogiri(位于libxml2之上并支持XPath 1.0表达式):

//p[1]//text() | //p[1]/following::text()

证明:

require 'nokogiri'

html = '<body><h1>A</h1><p>B <b>C</b></p><p>D <b>E</b></p></body>'
doc = Nokogiri.HTML(html)

p doc.xpath('//p[1]//text() | //p[1]/following::text()').map(&:text)
#=> ["B ", "C", "D ", "E"]

请注意,仅选择文本节点本身会返回NodeSetNokogiri::XML::Text个对象,因此,如果您只想要它们的文本内容,则必须通过.text(或.content)方法。