2013-08-13 2 views
0

Я хотел бы проанализировать HTML-файл, извлекая соответствующие данные для использования в моих исследованиях. Вот кусок HTML:Как разобрать HTML, используя Nokogiri?

<td class="color_line1" valign="center"><a class="linkpadrao" href="javascript:Direciona('5453*[email protected]');">Serra Talhada</a></td> 
<td class="color_line" valign="center" align="center">9</td> 
<td class="color_line" valign="center" align="center">2,973</td> 
<td class="color_line" valign="center" align="center">0,016</td> 
<td class="color_line" valign="center" align="center">2,939</td> 
<td class="color_line" valign="center" align="center">3,000</td> 
<td class="color_line" valign="center" align="center">0,572</td> 
<td class="color_line" valign="center" align="center">2,401</td> 
<td class="color_line" valign="center" align="center">0,024</td> 
<td class="color_line" valign="center" align="center">2,378</td> 
<td class="color_line" valign="center" align="center">2,426</td> 
</tr> 

Будучи более конкретными, я хотел бы получить «Серру-Тальяд» (как название города), а также все номера, ниже название города (это максимальное , мин и средняя цена на газ).

Я попытался это до сих пор:

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

url = "http://www.anp.gov.br/preco/prc/Resumo_Por_Estado_Municipio.asp" 

agent = Mechanize.new 

parameters = {'selSemana' => '737*De+28%2F07%2F2013+a+03%2F08%2F2013', 
    'desc_semana' => 'de+28%2F07%2F2013+a+03%2F08%2F2013', 
    'cod_Semana' => '737', 
    'tipo' => '1', 
    'Cod_Combustivel' => 'undefined', 
    'selEstado' => 'PE*PERNAMBUCO', 
    'selCombustivel' => '487*Gasolina', 
} 

municipio = [] 

page = agent.post(url, parameters) 

extrair = page.parser 

extrair.css('.linkpadrao').each do |posto| 
    # Municipios 
    municipio << posto.text 
end 

Я не могу понять, как получить номера, поскольку они имеют такую ​​же структуру HTML.

Любые мысли ?!

ответ

1

Вы можете получить номера после каждого Posto с:

posto.parent.search('~ td').map &:text 
+0

+1 Смешивание методов DOM и селекторов CSS часто является наиболее читаемым решением. –

+0

Спасибо, @pguardiario. Очень читаемо. – gfm

2

Поскольку вам нужно найти ячейки по отношению к городской ссылке, вы должны найти их общего предка - в этом случае их tr.

Использование XPath, вы можете найти определенную ячейку, ее текст:

# This is the table that contains all of the city data 
data_table = extrair.at_css('.table_padrao') 

# This is the specific row that contains the specified city 
row = data_table.xpath('//tr[td/a[@class="linkpadrao" and text()="Serra Talhada"]]') 

# This is the data in the specific row 
data = row.css(".color_line").map{|e| e.text } 
#=> ["9", "2,973", "0,016", "2,939", "3,000", "0,572", "2,401", "0,024", "2,378", "2,426"] 
+0

Почему взять хороший немного CSS и включите его в уродливое выражение xpath? – pguardiario

+1

@pguardiario, я думал, что им нужна определенная строка из таблицы на основе текста, отсюда и необходимость в xpath. –

+0

Спасибо, @ JustinKo. Счастлив учиться. – gfm

Смежные вопросы