2013-07-26 35 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