0

有没有一种合理的方法来提取 Mechanize-parsed HTML 文档中的每一个文本运行,以便(例如):

<p>Here is <b>some</b> text<p>

分为三个要素:

Here is
some
text

? 我的直觉是,有一种使用递归 CSS 搜索和/或#flatten 的简单技术,但我还没有弄清楚。

4

2 回答 2

1

借用“ Nokogiri recursively get all children ”中的答案:

result = []
doc.traverse { |node| result << node.text if node.text? }

那应该给你数组["Here is ", "some", " text"]

被 Nokogiri 抢劫”讨论traverse

于 2012-08-17T11:57:46.747 回答
1

由于您想要每个文本节点的内容,您可以这样做:

doc.search('//text()').map(&:text)

唯一的缺点(和另一个答案)是你也得到了元素之间的所有空白。如果你想抑制这个,你可以这样做:

doc.search('//text()').map(&:text).delete_if{|x| x !~ /\w/}

这将删除所有不包含单词字符的元素。

于 2012-08-18T13:58:24.843 回答