这是一个很容易解决的问题,是由于没有阅读有关如何解决的文档而导致的text
用于 NodeSet 与 Node(或 Element)时的行为。
The 节点集文档 http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/NodeSet:text says text
will:
获取所有包含的 Node 对象的内部文本
这就是我们所看到的情况:
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>foo</p>
<p>bar</p>
<p>baz</p>
</body>
</html>
EOT
doc.search('p').text # => "foobarbaz"
because:
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 的更轻松的版本。
节点有几个别名方法来获取其嵌入的文本。从文档 http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Node#content-instance_method:
#content ⇒ Object
也称为:text
, inner_text
返回此节点的内容。