2013-07-26 36 views
0

我试图从HTML页面获取一些内容。在这里我将HTML分成几个部分,并使用Nokogiri解析每个子部分。CSS与Nathogiri中的XPath不匹配

当我使用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不匹配?我应该为div变量创建一个新的Nokogiri::HTML(如果我将此用于包含多个子部分的大型文档,性能问题可能会出现)?或者用另一个元素包装它,以便<div>不是根元素?

回答

1

// in xpath mean from root; XPath表达式//...找到根元素,即使你发出div.at_xpath ..

另一方面手,从div标签div.at_css发现;没有匹配。

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

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

+0

感谢您对根元素的解释。使用'div.parent.at_css('div> h3')'它起作用,因为它考虑''元素作为起点。 – arnep

+1

@arnep,'div.at_css('> h3')'也适用。 – falsetru