看起來Nokogiri不知道如何處理命名空間參數。下面是得到同樣結果的另一種方法:這將返回所有div
節點與dd:meta2
參數
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" })]
# })]
。
同樣,你可以使用相同的用.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神解釋發生了什麼答案,並具有我建議同樣的解決方案之後。所以你有它。