我有这样的代码
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
我无法找到相关信息,但也许我忽略了它。 有这样的选择吗?
答案 0 :(得分:1)
您在attr
返回的NodeSet
上呼叫css
,而不是在单个Node
对象上。 attr
on a Node
会接受一个符号来指定属性,has done for a while,但看起来还没有对z = [0, 1, 0, 1, 0]
进行相应的更改。请注意NodeSet#attr
版NodeSet
用于在集合中的所有节点上设置属性,并且仅返回其包含的第一个节点上的属性值。你没有指定一个值。
您可以使用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"]