为什么CSS选择器返回正确的信息,但XPATH不返回?
?source = "<hgroup class='page-header channel post-head' data-channel='tech' data-section='sec0=tech&sec1=index&sec2='><h2>Tech</h2></hgroup>"
doc = Nokogiri::HTML(source)
doc.xpath('//hgroup[case_insensitive_equals(@class,"post-head")]//h2', XpathFunctions.new)
=> []
doc.css("hgroup.post-head")[0].css("h2")
=> [#<Nokogiri::XML::Element:0x6c2b824 name="h2" children=[#<Nokogiri::XML::Text:0x6c2b554 "Tech">]>]
假设case_insensitive_equals
执行其名称所暗示的内容,这是因为class
属性不等于post-head
(无论是否不敏感),但它确实包含包含。XPath将class
属性视为普通字符串,它不会将它们分开,并像CSS一样分别处理类。
一个简单的XPath将是:
doc.xpath('//hgroup[contains(@class, "post-head")]//h2')
(我已经删除了自定义功能,您需要编写自己的函数才能不敏感。)
这并不完全相同,因为它也将匹配诸如not-post-head
之类的类。更完整的XPath将是这样的:
doc.xpath('//hgroup[contains(concat(" ", normalize-space(@class), " "), " post-head ")]//h2')