Как получить правильные значения после разбора html-таблицы с помощью ruby ​​/ nokogiri - PullRequest
0 голосов
/ 21 сентября 2011

Я искал и искал в течение 3 дней прямо сейчас, пытаясь заставить работать скребок данных, и мне кажется, что я успешно проанализировал таблицу HTML, которая выглядит следующим образом:

<tr class='ds'>
<td class='ds'>Length:</td>
<td class='ds'>1/8"</td>
</tr>
<tr class='ds'>
<td class='ds'>Width:</td>
<td class='ds'>3/4"</td>
</tr>
<tr class='ds'>
<td class='ds'>Color:</td>
<td class='ds'>Red</td>
</tr>

Однако, я не могу заставить его правильно печатать в csv.

Код Ruby выглядит следующим образом:

Specifications = {
:length => ['Length:','length','Length'],       
:width => ['width:','width','Width','Width:'],  
:Color => ['Color:','color'], 
.......
}.freeze

def specifications
  @specifications ||= xml.css('tr.ds').map{|row| row.css('td.ds').map{|cell| cell.children.to_s } }.map{|record| 
  specification = Specifications.detect{|key, value| value.include? record.first } 
  [specification.to_s.titleize, record.last]  }
end 

И CSV печатает в один столбец (что похоже на полные массивы):

[["", nil], ["[:finishtype, [\"finish\", \"finish type:\", \"finish type\", \"finish type\", \"finish type:\"]]", "Metal"], ["", "1/4\""], ["[:length, [\"length:\", \"length\", \"length\"]]", "18\""], ["[:width, [\"width:\", \"width\", \"width\", \"width:\"]]", "1/2\""], ["[:styletype, [\"style:\", \"style\", \"style:\", \"style\"]]"........

Я считаю, что проблема в том, что я не указал, какие значения возвращать, но мне не удавалось каждый раз пытаться указать выходные данные. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 21 сентября 2011

Попробуйте изменить

[specification.to_s.titleize, record.last]

до

[specification.last.first.titleize, record.last]

detect дает, например, [:length, ["Length:", "length", "Length"]], который станет "[:length, [\"Length:\", \"length\", \"Length\"]]" по to_s. С помощью last.first вы можете извлечь только часть "Length:".

Если вы встретите атрибуты, не соответствующие вашему Specification, вы можете просто отбросить значения, изменив на:

    xml.css('tr.ds').map{|row| row.css('td.ds').map{|cell| cell.children.to_s } }.map{|record|  
      specification = Specifications.detect{|key, value| value.include? record.first }
      [specification.last.first.titleize, record.last] if specification 
    }.compact
...