2011-11-20 54 views
4

enter image description here未能提取html表格行

我嘗試提取上表中列出的所有五行。

我正在使用Ruby hpricot庫來使用xpath表達式提取錶行。

在我的例子中,我使用的xpath表達式是/ html/body/center/table/tr。請注意,我已經從表達式中移除了tbody標記,這通常是成功提取的情況。

奇怪的是,我得到結果中的前三行,最後兩行丟失。我不知道那裏發生了什麼。

編輯:沒有什麼關於代碼的魔力,只要附上請求。

require 'open-uri' 
require 'hpricot' 

faculty = Hpricot(open("http://www.utm.utoronto.ca/7800.0.html")) 
(faculty/"/html/body/center/table/tr").each do |text| 
    puts text.to_s 
end 
+0

我們可以看到你的代碼嗎? –

+0

@JoshuaClark先生,先生。 –

回答

9

問題的HTML文檔無效。 (請參閱http://validator.w3.org/check?uri=http%3A%2F%2Fwww.utm.utoronto.ca%2F7800.0.html。)Hpricot以不同於瀏覽器的方式對其進行解析 - 因此會得到不同的結果 - 但不能真正引起責難。在HTML5之前,關於如何解析無效的HTML文檔沒有標準。

我試着用Nokogiri替換Hpricot,它似乎給出了預期的解析。代碼:

require 'open-uri' 
require 'nokogiri' 

faculty = Nokogiri.HTML(open("http://www.utm.utoronto.ca/7800.0.html")) 

faculty.search("/html/body/center/table/tr").each do |text| 
    puts text 
end 

也許你應該切換?

+2

+1對於nokogiri – d11wtq

0

路徑table/tr不存在。它是table/tbody/trtable//tr。當您使用table/tr時,您特別需要尋找一個<tr>,它是<table>的直接後裔,但從您的圖像中,這不是標記的結構。

+1

tbody在本例中不存在。 Firefox擴展螢火蟲爲我們添加了額外的標籤。 table/tr在這裏工作,正如我原來的問題中提到的,但只是部分。我能夠提取前三行但不是最後兩行,這真的很奇怪。 –

+0

我沒有意識到螢火蟲添加了額外的標籤。這就解釋了爲什麼我今天如此艱難地使用nokogiri和螢火蟲來找到我關心的TR行。 (我有一張桌子,裏面嵌入了一張沒有ID的桌子。)現在我想知道HTML是否是無效的。 – beach