2013-04-07 21 views
4

我是Nokogiri和Ruby的新手。可以使用哪些XPath获取包含第一段节点的所有文本节点?

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

我试图使用XPath以下,但我还是一无所获:

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

这是行不通的。我需要改变什么?

+0

提供有关XML的小样本很重要。 – 2013-04-08 07:56:03

+0

http://www.zeit.de/wirtschaft/2013-04/produkte-schwachstellen-garantie-hersteller – user1895623 2013-04-08 11:12:33

+0

不,不是链接到你的样本,把它的样本放在问题中,足以证明问题和没有更大。一个链接让我们追逐我们需要的信息来帮助你,而且,因为我们自愿这样做,在我们的业余时间,你让我们做了额外的工作来帮助你。不要这样做。此外,链接断裂,使你的问题在将来寻找相同问题的人毫无价值。 – 2013-04-08 14:13:56

回答

4

您必须找到<p/>节点并返回所有text()节点,无论是内部还是后续节点。根据什么样的XPath功能引入nokogiri拥有,使用这些查询之一:

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

如果它不工作,用这个来代替,这需要找到第一款两次,可能是一点点,但可能不易察觉,慢:

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

甲可能不支持的XPath 2.0替代方法是:

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

,意思是“由第一之前所有文本节点文档中的节点“。

+0

+1,但请注意,只有你的第二个表达式适用于Nokogiri。 – Phrogz 2013-04-07 21:20:36

+0

这就是我所期望的,因此我提供了多个。我不确定第一个是否是有效的XPath 1.0,但是nokogiri不支持,或者它是否是XPath 2.0。作为最后一个编写该查询的最优雅的版本,无论如何我都将其包含在内。 – 2013-04-07 21:33:58

+0

@JensErat,非常感谢一位老兄,它像一个魅力。还有一件事,我的任务是解析这些德国网页,然后基本上将文章内容分成句子和单词,我的问题有正则表达式。我可以用英语完成这项工作,但是我不知道德文怎么办,分裂德文的最佳做法是什么。 (我的正则表达式被元音和eszets弄糊涂了),我已经在php中尝试了\ p {l}和\ x修饰符,但没有运气。如果你或其他人认为他们可以帮助我,我会提供完整的example.thnx – user1895623 2013-04-08 11:20:03

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)方法映射它们。

+0

这看起来是正确的,但我不认为[1]是必要的 – pguardiario 2013-04-08 00:26:12

+0

@Progro,+1,谢谢这也适用。请你能帮助我的另一个问题(ive添加它作为一个评论,下面jens erat的答案) – user1895623 2013-04-08 11:23:49

+0

@ user1895623问它作为[新问题](http://stackoverflow.com/questions/ask)。 – Phrogz 2013-04-08 12:51:42

相关问题