0

私の研究で使用する関連データを抽出する HTML ファイルを解析したいと思います。HTML の一部を次に示します。

<td class="color_line1" valign="center"><a class="linkpadrao" href="javascript:Direciona('5453*SERRA@TALHADA');">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>

より具体的には、「Serra Talhada」(都市名として) と、都市名の下のすべての数字 (ガスの最大、最小、平均価格) を取得したいと思います。

私はこれまでにこれを試しました:

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 構造を持っているため、数値を取得する方法がわかりません。

何かご意見は?!

4

2 に答える 2

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"]
于 2013-08-13T21:23:33.647 に答える