2016-05-26 11 views
-1

Ich habe diesen Code, der versucht, zu einer URL zu gehen und 'li' Elemente in ein Array zu analysieren. Ich bin jedoch auf ein Problem gestoßen, als ich versucht habe, alles zu parsen, was nicht in einem "b" -Tag ist.Nokogiri Parsing-Tabelle ohne HTML-Element

Code:

url = '(some URL)' 
page = Nokogiri::HTML(open(url)) 
csv = CSV.open("/tmp/output.csv", 'w') 

page.search('//li[not(@id) and not(@class)]').each do |row| 
    arr = [] 
    row.search('b').each do |cell| 
    arr << cell.text 
    end 
    csv << arr 
    pp arr 
end 

HTML:

<li><b>The Company Name</b><br> 
The Street<br> 
The City, 
The State 
The Zipcode<br><br> 
</li> 

Ich möchte alle Elemente analysieren, so dass die Ausgabe in etwa so sein würde:

["The Company Name", "The Street", "The City", "The State", "The Zip Code"], 
["The Company Name", "The Street", "The City", "The State", "The Zip Code"], 
["The Company Name", "The Street", "The City", "The State", "The Zip Code"] 

Antwort

0

I ended bis ich die Lösung für meine eigene Frage gefunden habe. Wenn jemand interessiert ist, habe ich einfach

geändert
row.search('b').each do |cell| 

in:

row.search('text()'.each do |cell| 

Ich habe auch

arr << cell.text 

in:

arr << cell.text.gsub("\n", '').gsub("\r", '') 

um alle \ n und die \ r zu entfernen, die vorhanden waren, in die Ausgabe.

1
require 'nokogiri' 

def main 
    output = [] 
    page = File.open("parse.html") {|f| Nokogiri::HTML(f)} 
    page.search("//li[not(@id) and not (@class)]").each do |row| 
    arr = [] 
    result = row.text 
    result.each_line { |l| 
     if l.strip.length > 0 
     arr << l.strip 
     end 
    } 
    output << arr 
    end 
    print output 
end 

if __FILE__ == $PROGRAM_NAME 
    main() 
end 
+0

Das eine Riesen Array zurückgibt, wie '[ "Straßenname", "Stadt", "Staat" aussieht" Zip "," Anderer Straßenname "," Andere Stadt "," Anderer Staat "," Anderer Zip "]' – Vladmrnv

+0

Sie haben Recht. hat den Code aktualisiert. –

0

Basierend auf Ihren HTML würde ich es gerne tun:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<ol> 
<li><b>The Company Name</b><br> 
The Street<br> 
The City, 
The State 
The Zipcode<br><br> 
</li> 
<li><b>The Company Name</b><br> 
The Street<br> 
The City, 
The State 
The Zipcode<br><br> 
</li> 
</ol> 
EOT 

doc.search('li').map{ |li| 
    text = li.text.split("\n").map(&:strip) 
} 
# => [["The Company Name", 
#  "The Street", 
#  "The City,", 
#  "The State", 
#  "The Zipcode"], 
#  ["The Company Name", 
#  "The Street", 
#  "The City,", 
#  "The State", 
#  "The Zipcode"]]