2012-03-29 50 views
0

林试图解析标签不与引入nokogiri一个表中的每个小区的多个标签的表,其中有多于一个仅在一个TD字段:与引入nokogiri解析成其中存在在某一列

<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命令。

由于马库斯

+0

的解决方案是:company.at_css( “businesscategory”)儿童 – Markus 2012-03-29 16:15:13

+0

'company'不是数组,它是一个''元素。当你说它“不工作”时,你的意思是什么?将来,请不仅提供您的示例输入和代码(很棒),还要提供您试图获得的示例输出以及实际的错误消息或错误输出。 – Phrogz 2012-03-29 18:52:42

回答

3

.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 " 
+0

没有帮助...试过了,但是company.at_css(“。businesscategory”)。children did it ... – Markus 2012-03-29 18:28:39

+0

小心,'.children'会返回所有孩子,即使是不是元素的孩子,包括空白的文本节点。 – 2012-03-29 18:42:21