18

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

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

我已经将所有 HTML 加载到一个名为record. 如果存在,我需要解析出年份,即 2009 年。

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

这是一个微不足道的问题,但我还没有设法弄清楚。

4

3 回答 3

17

要获取所有带有文本的直接子级,但不获取任何其他子级,您可以使用 XPath,如下所示:

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

或者,如果您想使用搜索:

doc.search('dt').xpath('text()')
于 2012-05-29T12:53:37.140 回答
12

使用 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
于 2012-05-29T21:49:06.663 回答
5

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

doc.search("dt").children.last.text
于 2012-05-29T12:46:47.467 回答