为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]

Posted

技术标签:

【中文标题】为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]【英文标题】:Why does .css work with this Nokogiri object but not XPath? [duplicate]为什么 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制] 【发布时间】:2017-04-13 22:41:32 【问题描述】:

为什么 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">]>] 

【问题讨论】:

【参考方案1】:

假设case_insensitive_equals 符合其名称的含义,这是因为class 属性不等于post-head(是否不区分大小写),但它确实包含它。 XPath 将class 属性视为纯字符串,它不会像 CSS 那样拆分它们并单独处理类。

一个可行的简单 XPath 是:

doc.xpath('//hgroup[contains(@class, "post-head")]//h2')

(我已经删除了自定义函数,您需要自己编写以不区分大小写。)

但这并不完全相同,因为它也会匹配诸如not-post-head 之类的类。更完整的 XPath 是 something like this:

doc.xpath('//hgroup[contains(concat(" ", normalize-space(@class), " "), " post-head ")]//h2')

【讨论】:

以上是关于为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 nokogiri 将内容中的链接替换为 rails 中的已处理链接

是否有类似于 lxml 或 nokogiri 的 Java 库? [关闭]

使用nokogiri剥离样式属性

为啥这个 CSS 媒体查询没有对在 iPhone 上显示的网站进行更改? [复制]

nokogiri gem installation error

如何使用 Nokogiri 解析 HTML 表格?