5

我是 Nokogiri 和 Ruby 的新手。

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

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

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

这行不通。我必须改变什么?

4

2 回答 2

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/>”。

于 2013-04-07T20:06:02.600 回答
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"]

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

于 2013-04-07T21:17:40.920 回答