为什么.css与此Nokogiri对象一起使用而不是XPATH



为什么CSS选择器返回正确的信息,但XPATH不返回?

source = "<hgroup class='page-header channel post-head' data-channel='tech' data-section='sec0=tech&amp;sec1=index&amp;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')

相关内容

  • 没有找到相关文章

最新更新