为啥 .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&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">]>]
【问题讨论】:
【参考方案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 库? [关闭]
为啥这个 CSS 媒体查询没有对在 iPhone 上显示的网站进行更改? [复制]