有没有办法通过使用符号键而不是字符串键访问Nokogiri :: XML :: Attr

时间:2015-10-07 19:31:57

标签: ruby nokogiri

我有这样的代码

require 'nokogiri'
url = ENV['URL']
doc = Nokogiri::HTML(open(url))
link = doc.css('a#foo').attr('href').value

我希望使用这样的符号来访问Nokogiri::XML::Attr

doc = Nokogiri::HTML(open(url), hash_key_symbol: true)
link = doc.css('a#foo').attr(:href).value

我无法找到相关信息,但也许我忽略了它。 有这样的选择吗?

2 个答案:

答案 0 :(得分:1)

您在attr返回的NodeSet上呼叫css,而不是在单个Node对象上。 attr on a Node会接受一个符号来指定属性,has done for a while,但看起来还没有对z = [0, 1, 0, 1, 0] 进行相应的更改。请注意NodeSet#attrNodeSet用于在集合中的所有节点上设置属性,并且仅返回其包含的第一个节点上的属性值。你没有指定一个值。

您可以使用at_css显式选择查询的第一个匹配节点,然后您可以使用符号:

attr

或者,您可以通过索引从节点集中选择节点:

doc.at_css('a#foo').attr(:href).value

答案 1 :(得分:1)

访问标记中参数的简单方法是使用“hash”[]语法:

require 'nokogiri'

html = <<EOT
<html>
  <body>
    <a href="blah" id="foo">bar</a>
  </body>
</html>
EOT

doc = Nokogiri::HTML(html)
doc.at('a#foo')['href'] # => "blah"

但我们可以使用符号:

doc.at('a#foo')[:href] # => "blah"

注意,at等同于search('a#foo').first,并且都返回一个节点。 search,其CSS和XPath变量返回NodeSets,后者无法返回特定节点或所有节点的属性。要处理多个节点,请使用map

html = <<EOT
<html>
  <body>
    <a href="blah" class="foo">bar1</a>
    <a href="more_blah" class="foo">bar2</a>
  </body>
</html>
EOT

doc = Nokogiri::HTML(html)
doc.search('a.foo').map{ |n| n['href'] } # => ["blah", "more_blah"]