有没有一种合理的方法来提取 Mechanize-parsed HTML 文档中的每一个文本运行,以便(例如):
<p>Here is <b>some</b> text<p>
分为三个要素:
Here is
some
text
? 我的直觉是,有一种使用递归 CSS 搜索和/或#flatten 的简单技术,但我还没有弄清楚。
有没有一种合理的方法来提取 Mechanize-parsed HTML 文档中的每一个文本运行,以便(例如):
<p>Here is <b>some</b> text<p>
分为三个要素:
Here is
some
text
? 我的直觉是,有一种使用递归 CSS 搜索和/或#flatten 的简单技术,但我还没有弄清楚。
借用“ Nokogiri recursively get all children ”中的答案:
result = []
doc.traverse { |node| result << node.text if node.text? }
那应该给你数组["Here is ", "some", " text"]
。
“被 Nokogiri 抢劫”讨论traverse
。
由于您想要每个文本节点的内容,您可以这样做:
doc.search('//text()').map(&:text)
唯一的缺点(和另一个答案)是你也得到了元素之间的所有空白。如果你想抑制这个,你可以这样做:
doc.search('//text()').map(&:text).delete_if{|x| x !~ /\w/}
这将删除所有不包含单词字符的元素。