直接在Nokogiri的标签内获取文本

时间:2012-05-29 12:27:03

标签: ruby nokogiri

我有一些看起来像这样的HTML:

<dt>
  <a href="#">Hello</a>
  (2009)
</dt>

我已将所有HTML加载到名为record的变量中。我需要解析一年,即2009年是否存在。

如何获取dt标记内的文字,而不是a标记内的文字?我使用了record.search("dt").inner_text,这给了我一切。

这是一个微不足道的问题,但我还没有想到这一点。

3 个答案:

答案 0 :(得分:17)

为了让所有带有文本的直接孩子,而不是任何进一步的子孩子,你可以像这样使用XPath:

doc.xpath('//dt/text()')

或者如果您想使用搜索:

doc.search('dt').xpath('text()')

答案 1 :(得分:10)

使用XPath准确选择你想要的东西(正如@Casper所建议的)是正确的答案。

def own_text(node)
  # Find the content of all child text nodes and join them together
  node.xpath('text()').text
end

这是另一种有趣的答案:)

def own_text(node)
  node.clone(1).tap{ |copy| copy.element_children.remove }.text
end

见过:

require 'nokogiri'
root = Nokogiri.XML('<r>hi <a>BOO</a> there</r>').root
puts root.text       #=> hi BOO there
puts own_text(root)  #=> hi  there

答案 2 :(得分:5)

dt元素有两个子元素,因此您可以通过以下方式访问它:

doc.search("dt").children.last.text