看起来 Nokogiri 不知道如何处理命名空间参数。这是获得相同结果的另一种方法:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<body>
<div class="myclass" dd:meta1="meta data 1" dd:meta2="CD5503253E54"></div>
<div class="myclass" dd:meta1="meta data 11"></div>
</body>
EOT
doc.search('div').select{ |div| div.attributes.include?('dd:meta2') }
# => [#(Element:0x3fea99895530 {
# name = "div",
# attributes = [
# #(Attr:0x3fea99895508 { name = "class", value = "myclass" }),
# #(Attr:0x3fea998954f4 { name = "dd:meta1", value = "meta data 1" }),
# #(Attr:0x3fea998954e0 { name = "dd:meta2", value = "CD5503253E54" })]
# })]
这将返回所有带有dd:meta2 参数的div 节点。
同样,您可以使用相同的 .first 在末尾添加以像 at 一样操作,但它不会像以下那样快:
doc.search('div').find{ |div| div.attributes.include?('dd:meta2') }
# => #(Element:0x3fea99895530 {
# name = "div",
# attributes = [
# #(Attr:0x3fea99895508 { name = "class", value = "myclass" }),
# #(Attr:0x3fea998954f4 { name = "dd:meta1", value = "meta data 1" }),
# #(Attr:0x3fea998954e0 { name = "dd:meta2", value = "CD5503253E54" })]
# })
这会比你尝试的慢一点,因为它会导致解析器搜索整个文档并返回所有 div 标签,然后 Ruby 将不得不筛选结果以找到具有所需的参数。但它会比引发异常的代码快得多。
我建议向 Nokogiri 团队提交一份错误报告,向他们展示问题。
嘿,在写完之后我搜索了dd:meta2 并遇到了your question on Nokogiri-Talk,它有一个来自 Nokogiri 神的答案,解释了正在发生的事情,这与我建议的解决方案相同。所以你有它。