我对Nokogiri和Ruby都是新手。
我想获得文档中所有节点的文本,从第一个段落节点开始并包含该节点。
我尝试使用XPath执行以下操作,但一无所获:
puts page.search("//p[0]/text()[next-sibling::node()]")
这行不通。我需要改变什么?
您必须找到<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/>
节点之前的所有文本节点"。
这适用于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"]
请注意,仅选择文本节点本身将返回Nokogiri::XML::Text
对象的NodeSet
,因此,如果您只想要它们的文本内容,则必须通过.text
(或.content
)方法映射它们。