gpt4 book ai didi

html - 抓取时如何避免加入来自节点的所有文本

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:43 26 4
gpt4 key购买 nike

当我从 HTML 或 XML 中抓取多个相关节点以提取文本时,所有文本都连接成一个长字符串,因此无法恢复单个文本字符串。

例如:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
<p>baz</p>
</body>
</html>
EOT

doc.search('p').text # => "foobarbaz"

但我想要的是:

["foo", "bar", "baz"]

抓取 XML 时也会发生同样的情况:

doc = Nokogiri::XML(<<EOT)
<root>
<block>
<entries>foo</entries>
<entries>bar</entries>
<entries>baz</entries>
</block>
</root>
EOT

doc.search('entries').text # => "foobarbaz"

为什么会发生这种情况,我该如何避免?

最佳答案

这是一个很容易解决的问题,是由于没有阅读有关 text 在 NodeSet 与 Node(或 Element)上使用时的行为方式的文档而导致的。

NodeSet documentationtext 将:

Get the inner text of all contained Node objects

这就是我们看到的情况:

doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
<p>baz</p>
</body>
</html>
EOT

doc.search('p').text # => "foobarbaz"

因为:

doc.search('p').class # => Nokogiri::XML::NodeSet

相反,我们想要获取每个节点并提取其文本:

doc.search('p').first.class # => Nokogiri::XML::Element
doc.search('p').first.text # => "foo"

可以使用 map 完成:

doc.search('p').map { |node| node.text } # => ["foo", "bar", "baz"]

Ruby 允许我们使用以下方式更简洁地编写:

doc.search('p').map(&:text) # => ["foo", "bar", "baz"]

无论我们使用 HTML 还是 XML,同样的事情适用,因为 HTML 是 XML 的更宽松版本。

节点有几个别名方法来获取其嵌入的文本。来自 the documentation :

#content ⇒ Object

Also known as: text, inner_text

Returns the contents for this Node.

关于html - 抓取时如何避免加入来自节点的所有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43594656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com