我无法搜索具有HTML实体作为值的节点。
我有这个HTML片段:
require 'nokogiri'
DATA = "<p>A paragraph <ul><li>Item 1</li><li>⊕</li><li>Mango</li></ul></p>"
doc = Nokogiri::HTML(DATA)
p doc.xpath('//li[contains(text(), "Man")]') => This returns a NodeSet
p doc.xpath('//li[contains(text(), "8853")]') => This returns 'Nil'
我无法弄清楚为什么第二个语句会返回NIL以及如何修复它。
答案 0 :(得分:7)
当Nokogiri解析文档时,它会尝试解码实体,因此,您必须查找已解码的值:
require 'nokogiri'
data = "<p>A paragraph <ul><li>Item 1</li><li>⊕</li><li>Mango</li></ul></p>"
doc = Nokogiri::HTML(data)
p doc.search('li').map(&:text)
=> ["Item 1", "⊕", "Mango"]
请注意,HTML实体已被解码为其真实字符。
puts doc.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>A paragraph </p>
<ul>
<li>Item 1</li>
<li>⊕</li>
<li>Mango</li>
</ul>
</body></html>
再次,实体被解码。
p doc.xpath('//li[contains(text(), "⊕")]')
=> [#<Nokogiri::XML::Element:0x3fcd78d5f16c name="li" children=[#<Nokogiri::XML::Text:0x3fcd78d5ef64 "⊕">]>]