2013-08-04 110 views
-1

我有一張我想分析的HTML表格。我想要移動每個<TR>並提取href。 的HTML看起來像這樣:如何使用Nokogiri使用CSS選擇器逐行解析?

table id="classified_table" class="vs-classified-table widget-off top" cellspacing="0" cellpadding="0" border="0"> 
    <tbody> 
    <tr> 
    <td id="classified_cell"> 
    <table class="vs-classified-table widget-off" cellspacing="0" cellpadding="0" border="0"> 
    <tbody> 
    <tr id="vs_classified_73634384" class="classified row1 kiwii-clad-row kiwii-clad-featured"> 
    <tr id="vs_classified_74530668" class="classified row2 kiwii-clad-row kiwii-clad-featured"> 
    <tr id="vs_classified_62296263" class="classified row3 kiwii-clad-row kiwii-clad-featured"> 
    <tr id="vs_classified_62468547" class="classified row4 kiwii-clad-row kiwii-clad-featured"> 
    <tr id="vs_classified_47122034" class="classified row5 kiwii-clad-row kiwii-clad-featured"> 
    <tr id="vs_classified_78210646" class="classified row6 kiwii-clad-row"> 
    <tr id="vs_classified_78207083" class="classified row7 kiwii-clad-row"> 
    <tr id="vs_classified_69104369" class="classified row8 kiwii-clad-row"> 
    <tr id="vs_classified_78113204" class="classified row9 kiwii-clad-row"> 
    <tr id="vs_classified_52761813" class="classified row10 kiwii-clad-row"> 
    <tr id="vs_classified_78121746" class="classified row11 kiwii-clad-row"> 
    <tr id="vs_classified_76515548" class="classified row12 kiwii-clad-row"> 
    <tr id="vs_advert_middle" class="vs-advertisement advertisment-middle-2 vs-adsense-middle-BR-" style="border:none"> 
    <tr id="vs_classified_34048811" class="classified row13 kiwii-clad-row"> 

我的Ruby代碼看起來是這樣的:

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

page = Nokogiri::HTML(open('http://servico-informatica.vivanuncios.com/computador+rio-de-janeiro-capital/')) 
rows = page.css('tr#vs_classified_73634384.classified td.summary div a#vs-detail-link-1.kiwii-clear-none') 
puts rows.text 
#this works 

rows [1..10].each do |row| 
    puts "this isn't working :(" 

end 

第一個成功地打印打印第一<TR>的文本,但putseach循環內不工作。

我想刮的頁面是:http://servico-informatica.vivanuncios.com/computador+rio-de-janeiro-capital/

+1

你可以發佈一個你正在尋找什麼樣的輸出方面的例子嗎?你想要一個只有鏈接的數組?你想要鏈接中的文字嗎? – miah

+1

您的HTML樣本無效且缺少HREF,並且您尚未指定您對鏈接感興趣的HREF。 –

回答

1

我不知道你希望這個做什麼:

rows [1..10].each do |row| 
    puts "this isn't working :(" 
end 

但我敢肯定它不會做你期望的事情。這實際上解釋爲這樣:

rows[1..10].each { ... } 

而且由於rows(這是一個Nokogiri::XML::NodeSet)只有一個入口,試圖extract a subset開始1給你一個空NodeSet;這意味着你實際上只是這麼說:

some_empty_node_set.each { ... } 

並且沒有任何用處。但是,如果你看一下在rows中的第一項,你會發現href你正在尋找:

rows[0]['href'] 
# "http://servico-informatica.vivanuncios.com/..." 

你也可以看看依口味rows.attr('href')rows.first['href'],哪些適合您的需要。

+0

「把這不起作用」只是爲了確保我的代碼正在工作,直到這一點。 你對什麼即時通訊試圖做的猜測不是很遙遠:) 我試圖讓文本和每個條目的href() 你能告訴我用CSS路徑選擇什麼嗎? –

3

您只收到一個結果,因爲您的css查詢使用的是#這意味着它正在頁面上尋找一個唯一元素(Spec)。

因此,您需要修改查詢以查找基於css類的href。

tr.classified td.summary a.classified-link 

更新

以上的CSS路徑將抓住所有的鏈接,那麼你只需要通過陣列走,做你需要與href和文本內容。

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

page = Nokogiri::HTML(open('http://servico-informatica.vivanuncios.com/computador+rio-de-janeiro-capital/')) 
links = page.css("tr.classified td.summary a.classified-link") 

links.map do |link| 
    puts link['href'] 
    puts link.content 
end 
+0

實際上,nokogiri不關心規範。如果有兩個具有相同ID的元素,'css'將返回兩個元素。 – pguardiario

+0

一個公平的,它仍然只抓取一個元素,因爲該頁面正在創建唯一的ID – miah

+0

所以最好的方法是什麼?指向tbody,然後創建另一個指向TR的變量,然後循環? –