2010-01-22 37 views
3

我正在從論壇中提取數據。我的腳本based on工作正常。現在我需要從單個帖子中提取日期和時間(2009年12月21日,20:39)。我無法得到它的工作。我使用FireXPath來確定xpath。使用Ruby/Mechanize(和Nokogiri)從HTML中提取單個字符串

示例代碼:

require 'rubygems' 
require 'mechanize' 

    post_agent = WWW::Mechanize.new 
    post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708') 
    puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip 
    puts post_page.parser.at_xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip 
    puts post_page.parser.xpath('//[@id="post1960370"]/tbody/tr[1]/td/div[2]/text()') 

我所有的努力與空字符串或錯誤結束。


我找不到在Mechanize中使用Nokogiri的任何文檔。 The Mechanize documentation說,在頁面的底部:

你已經使用機械化導航到你需要刮掉頁面,然後利用引入nokogiri方法刮它之後。

但是有什麼方法?我在哪裏可以閱讀關於樣本並解釋語法的內容?我在Nokogiri's site上也找不到任何東西。

回答

27

Radek。我會告訴你如何釣魚。

當您撥打Mechanize::Page::parser時,它會提供Nokogiri文件。所以你的「xpath」和「at_xpath」調用正在調用Nokogiri。問題出在你的xpaths中。一般來說,從可以開始工作的最普通的xpath開始,然後縮小它的範圍。因此,例如,而不是這樣的:

puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip 

啓動與此:

puts post_page.parser.xpath('//table').to_html 

這得到任何表,任何地方,則打印出來的HTML。檢查HTML,查看它帶回的表格。當你只想要一個表時,它可能會抓住幾個,所以你需要告訴它如何挑選出你想要的表。如果,例如,你發現你想要的表有CSS類「userdata」,那就試試這個:

puts post_page.parser.xpath("//table[@class='userdata']").to_html 

任何時候你不回來一個數組,你瘋玩了XPath的,所以修復在繼續之前。一旦你得到你想要的表,然後嘗試獲取行:

puts post_page.parser.xpath("//table[@class='userdata']//tr").to_html 

是否奏效,然後脫下「to_html」你現在有引入nokogiri節點的數組,每個錶行。

這就是你如何做到這一點。

+2

PS:這是一個通用教程,展示瞭如何找出正確的xpath:你並沒有從完全指定的xpath開始,因爲如果它不返回任何東西,你就不知道有什麼問題。從一般的東西開始,保證返回一些東西,然後繼續使它更具體,直到你有了你想要的一件事。通過逐步完成它,當它不起作用時,您知道這是您添加到xpath的最後一件事。 – 2010-01-22 03:57:18

+0

@Wayne康拉德:嗨,韋恩,謝謝你的好教程。我會嘗試你說的,但我認爲,因爲我只想要元素的第一個實例,它會很容易和快速地使用絕對xpath。它會給我從數組中的第一項。 – Radek 2010-01-22 03:58:53

+0

因此,即使您想要查看該問題的次數,您仍然可以執行所有這些步驟? – Radek 2010-01-22 04:03:42

6

我想你已經從Firebug複製了這個,螢火蟲給了你一個額外的tbody,它可能不在實際的代碼中......所以我的建議是刪除那個tbody並再試一次。 如果它仍然不起作用......那麼按照韋恩康拉德的流程,這是最好的!

+6

瀏覽器內的源代碼始終是可疑的,因爲瀏覽器可以並且將會對很多HTML進行修復,或者只是將其修改爲他們想要的格式。''標籤就是一個很好的例子。我使用瀏覽器的源代碼視圖作爲「有點像這樣」的視圖,但直接從主機中檢索實際的HTML,並在編輯器中查看它,當我試圖解析這些東西似乎是無稽之談時。在解析後的文檔中使用IRB打開並戳動的情況通常已經夠用了,但有時需要打開編輯器。 – 2010-12-29 23:03:02

+0

+1 @ The Tin Man:非常真實! – RubyDubee 2010-12-30 10:16:15