2013-05-13 36 views
2

我試圖使用機械化來從頁面中尋找一些標籤。我已經成功地使用了Nokogiri來刮擦它們,但現在我正試圖將它們組合成更廣泛的機械類。這裏是引入nokogiri聲明:如何將Nokogiri聲明轉換爲機械化以進行屏幕抓取?

page = Nokogiri::HTML(open(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT'])) 
@model.icons = page.css("link[rel='apple-touch-icon']").to_s 

而且這裏是我認爲將是等效的機械化,但它不工作:

agent = Mechanize.new 
page = agent.get(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT']) 
@model.icons = page.search("link[rel='apple-touch-icon']").to_s 

第一個返回的鏈接標籤如預期<link rel="apple-touch-icon" etc etc..></link>。第二個語句返回一個空白字符串。如果我把to_s關閉,我會得到超長的輸出。我認爲這是一個錯誤或實際的機械化對象或其他東西。

鏈接到長時間的輸出時不轉換爲字符串:https://gist.github.com/eadam/5583541

+1

定義「不工作」。作爲「搜索」方法的返回值,你會得到什麼?你期望得到什麼?如果您指向我們的網頁或包含適當的代碼段,這也會很有幫助。 – 2013-05-14 00:42:32

+0

我用完整的語句和不工作的定義更新了問題。謝謝。 – Adam 2013-05-14 22:37:49

+1

你可以發佈你獲得的「超長輸出」嗎? – 2013-05-15 02:27:14

回答

1

沒有樣本HTML很難重現問題,所以這是一些一般信息可以幫助您。

「長輸出」是當您使用search方法時得到的Nokogiri :: NodeSet的輸出。如果search返回多個節點,或者節點有很多子節點,則inspect輸出可以繼續某種方式,但是,這就是它應該執行的操作。

csssearch非常相似,因爲它們返回一個NodeSet。 css假定傳入的字符串是一個CSS存取器,而search是更通用的,並試圖找出傳入的內容是CSS還是XPath表達式。如果數字錯誤,則該模式找到匹配的可能性不大。您可以使用atsearch作爲通用的,並讓Nokogiri算出來,或者at_css,at_xpathcssxpath分別替換它們。 at派生都返回第一個匹配節點,類似於使用search('some_path').first

to_s接通節點集回那是我更喜歡要更明確的傳遞,使用源的表示任一to_xmlto_xhtmlto_html

爲什麼不像css那樣得到search的輸出?我不知道,因爲我無法測試你正在解析的HTML。回答問題,如數據處理,是GIGO的情況。