парсинг с nokogiri в таблицу, где есть несколько меток в каждой ячейке определенного столбца - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь разобрать метки из таблицы с помощью nokogiri, где их более одного в одном только поле td:

    <tr class="alt2">
      <td class="company">ABB Shanghai Transformer Co., Ltd.</td>
      <td class="contactperson">Mr.  Frank Liang<br/></td>
      <td class="businesscategory">
        <label><code>C27.11 </code>Manufacture of electric motors, generators and transformers</label>
        <label><code>C27.33 </code>Manufacture of wiring devices</label>
      </td>
    </tr>

Итак, что я сделал сейчас, это:

 doc.css("tbody tr").each do |company|
   new = GermanSubsidiary.new
   new.name = company.at_css(".company").text
   new.contact = company.at_css(".contactperson").text 
   company.at_css(".businesscategory label").each do |category|
     new_class = BusinessClassification.create
     new_class.code = category.at_css("code").text
     new_class.name = category.text
   end
 end

к сожалению company.at_css(".businesscategory label").each do |category| не работает, потому что at_css не работает для массивов ... так ли это?

Как я могу глубже разобраться в структуре?Поскольку есть таблица с несколькими строками, которую я должен различить в строке, которую я нацеливаю, я не могу использовать команду xpath для всего документа.

Спасибо, Маркус

1 Ответ

3 голосов
/ 29 марта 2012

.at_css('.businesscategory label') возвращает только первый соответствующий узел. Используйте .css('.businesscategory label'), чтобы получить все подходящие узлы

это xml

xml = <<-XML
<tbody>
  <tr class="alt2">
    <td class="company">ABB Shanghai Transformer Co., Ltd.</td>
    <td class="contactperson">Mr.  Frank Liang<br/></td>
    <td class="businesscategory">
      <label><code>C27.11 </code>Manufacture of electric motors, generators and transformers</label>
      <label><code>C27.33 </code>Manufacture of wiring devices</label>
    </td>
  </tr>
</tbody>
XML

и этот скрипт

require 'rubygems'
require 'nokogiri'
require 'pp'

doc = Nokogiri::HTML.fragment(xml)

puts "with at_css example:"
doc.css("tbody tr").each do |company|
  company.at_css(".businesscategory label").each do |category|
    puts category.at_css("code").text
    puts category.text
  end
end

puts "\n\nwith css"
doc.css("tbody tr").each do |company|
  company.css(".businesscategory label").each do |category|
    puts category.at_css("code").text
    puts category.text
  end
end

печатает этот результат

with at_css example:


with css
C27.11 
C27.11 Manufacture of electric motors, generators and transformers
C27.33 
C27.33 Manufacture of wiring devices

Итак, как видите, использование .css вместо .at_css решит вашу проблему.

Использование .at_css('.businesscategory').children приведет к появлению пробельных узлов, поэтому будьте осторожны

puts "\n\nwith at_css().children"
doc.css("tbody tr").each do |company|
  company.at_css(".businesscategory").children.each do |category|
    puts category.text.inspect
  end
end

печать

with at_css().children
"\n      "
"C27.11 Manufacture of electric motors, generators and transformers"
"\n      "
"C27.33 Manufacture of wiring devices"
"\n    "
...