2011-10-17 50 views
-1

我想獲得給定xpath的實際值。我有在sample.rb文件下面的代碼屏幕通過nokogiri或hpricot刮

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open('http://www.changebadtogood.com/')) 
desc "Trying to get the value of given xapth" 
task :sample do 
    begin 
    doc.xpath('//*[@id="view_more"]').each do |link| 
     puts link.content 
    end 
    rescue Exception => e 
    puts "error" 
    end 
end 

輸出是:

查看更多問題..

當我試圖讓其他a的值不同的XPath,如:
/html/body/div[4]/div[3]/h1/span 然後我得到「錯誤」消息。

我在Nokogiri嘗試過。我不知道這是爲什麼只給出幾個XPath的結果。

我在Hpricot中嘗試過。
http://hpricot.com/demonstrations

我貼我的網址和XPath的,我看到
//*[@id="view_more"]

查看更多問題的結果..
[本文是存在的問題,近期底部標題]

但未顯示結果:
/html/body/div[4]/div[3]/h1/span 對於此XPath,我期待結果Bad
[這是存在於 http://www.changebadtogood.com/如類=「英雄單元」 div的第一報頭。]

+1

這裏有很多問題。您沒有包含引發錯誤的代碼。捕獲錯誤和打印「錯誤」有什麼好處呢?讓錯誤得到提升,以便您可以調試它。在發佈問題之前,你應該修正你的縮進。 – pguardiario 2011-10-17 13:22:08

+0

而且,您提出了14個問題,但尚未接受單個答案。我已經在下面回答了您的問題,但我強烈建議您重溫[您以前提出的問題](http://stackoverflow.com/users/792302/vinothini),並且每次都找到最能解答您問題的答案(if任何)並接受它(單擊複選標記)。 – Phrogz 2011-10-18 02:41:10

回答

2

您的問題具有較差的XPath選擇器做的,並且是不相關的或引入nokogiri角度來說,Hpricot。讓我們研究一下:

irb:01:0> require 'nokogiri'; require 'open-uri' 
#=> true 
irb:02:0> doc = Nokogiri::HTML(open('http://www.changebadtogood.com/')); nil 
#=> nil 
irb:03:0> doc.xpath('//*[@id="view_more"]').each{ |link| puts link.content } 
View more issues .. 
#=> 0 
irb:04:0> doc.at('#view_more').text # Simpler version of the above. 
#=> "View more issues .." 
irb:05:0> doc.xpath('/html/body/div[4]/div[3]/h1/span') 
#=> [] 
irb:06:0> doc.xpath('/html/body/div[4]') 
#=> [] 
irb:07:0> doc.xpath('/html/body/div').length 
#=> 2 

由此我們可以看到,目前只有兩個div屬於<body>元素的孩子,所以div[4]未能選擇之一。

看樣子,你要在這裏選擇跨度:

<h1 class="landing_page_title"> 
    Change <span style='color: #808080;'>Bad</span> To Good 
</h1> 

而不是依賴於脆弱的標記導致這一(標定元件的匿名層次結構)的,使用文檔的語義結構讓您的選擇器更簡單,更健壯。使用CSS或XPath語法:

irb:08:0> doc.at('h1.landing_page_title > span').text 
#=> "Bad" 
irb:09:0> doc.at_xpath('//h1[@class="landing_page_title"]/span').text 
#=> "Bad"