CSS与Nokogiri中的XPath不匹配

时间:2013-07-26 08:59:34

标签: ruby xpath css-selectors nokogiri

我正在尝试从HTML页面获取一些内容。在这里,我将HTML分成几个部分,并使用Nokogiri解析每个子部分。

当我使用CSS选择器时,它与XPath选择器所执行的子部分不匹配:

#!/usr/bin/ruby
require 'nokogiri'

# construct simple HTML
doc = Nokogiri::HTML('<div><h3>Heading</h3></div>')
puts doc, "\n"

# get the div
div = doc.at_css('div')
puts div, "\n"

# get heading using XPath and CSS. CSS doesn't match!
puts "XPath: ", div.at_xpath('//div/h3[1]') || "no match"
puts "CSS: ", div.at_css('div > h3') || "no match"

输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" 
    "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div><h3>Heading</h3></div></body></html>

<div><h3>Heading</h3></div>

XPath: 
<h3>Heading</h3>
CSS:
no match

正如您所看到的,CSS部分没有匹配。那么为什么表达式div > h3不匹配?我应该为Nokogiri::HTML变量创建一个新的div(如果我将它用于包含许多子部分的大型文档,可能会出现性能问题)?或者用另一个元素包装它,以便<div>不是根元素?

1 个答案:

答案 0 :(得分:1)

xpath中的

//表示来自root ;即使您发出//... ..

,xpath表达式div.at_xpath也会从根中查找元素

另一方面,div.at_cssdiv标记中找到;不配。

div > h3(css)与//div/h3[1](xpath)不同。

div > h3(css)类似于.//div/h3[1](xpath)。