2011-08-22 40 views
5

我是程序員的新手,所以對我的新手很抱歉。所以我正在使用Nokogiri刮擦警察犯罪日誌。這是下面的代碼:Nokogiri:遇到錯誤「未定義的方法」文本爲零:NilClass「

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.sfsu.edu/~upd/crimelog/index.html" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css("title").text 
doc.css(".brief").each do |brief| 
puts brief.at_css("h3").text 
end 

我使用的小工具選擇書籤查找日誌的CSS選擇器(瑞豐)。當我通過brief.at_css傳遞「h3」時,我得到了裏面所有帶有內容的h3標籤。

但是,如果我添加.text方法來刪除標記,我會得到NoM​​ethod錯誤。

是否有任何理由,這是怎麼回事?我錯過了什麼?謝謝!

回答

8

要澄清,如果您查看HTML源代碼的結構,您將看到<div class="brief">的第一個匹配項沒有子項h3標籤(它實際上只有一個子標籤<p>)。

Nokogiri Docs

at_css(*規則)

搜索這個節點的CSS規則的第一次出現。相當於css(規則).first請參閱節點#css以獲取更多信息。

如果您致電at_css(*rules)該文檔聲明它相當於css(rules).first。當有物品(你.brief類包含一個h3),那麼將Nokogiri::XML::Element對象返回這是爲了響應text,而如果你的.brief不包含h3然後NilClass對象返回,這當然並不text

迴應

因此,如果我們稱之爲css(rules)(因爲你還沒有at_css)我們得到了Nokogiri::XML::NodeSet對象中返回,其中有定義爲text()方法(注意alias

# Get the inner text of all contained Node objects 
    def inner_text 
    collect{|j| j.inner_text}.join('') 
    end 
    alias :text :inner_text 

,因爲班級是Enumerable它遍歷它的孩子調用它們的inner_text方法並將它們連接在一起。

因此您可以執行nil?檢查或@floatless正確地指出僅僅使用css方法

+0

真棒,做到了!非常感謝! – aboutaaron

4

你只需要用css代替at_css,一切都應該沒問題。

+0

除了'css'返回一個節點集,其中'at_css'返回一個節點,所以節點集將需要迭代。 –

+0

除了您也可以在NodeSet上調用#inner_text。是否它會做你想要的取決於你想要發生什麼,當有> 1匹配。如果總是隻有0或1,它可能會做你想要的。 – jrochkind

相關問題