2017-10-28 1 views
0

Ich kratze diese Seite https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=Duhig und für jeden tr Ich sammle und gebe den Namen der Ebene und die Anzahl der verfügbaren Computer.Nokogiri iteriert über tr Tags zu oft

Das Problem ist, dass es zu oft iteriert wird. Es gibt nur 4 tr Tags, aber die Schleife durchläuft 5 Iterationen. Dies bewirkt, dass ein zusätzliches nil an das Rückgabe-Array angehängt wird. Warum ist das?

Scraped Sektion:

<table class="chart"> 
    <tr valign="middle"> 
     <td class="left"><a href="availablepcsembed.php?branch=Duhig&room=Lvl1">Level 1</a></td> 
     <td class="middle"><div style="width:68%;"><strong>68%</strong></div></td> 
     <td class="right">23 Free of 34 PC's</td> 
    </tr> 

    <tr valign="middle"> 
     <td class="left"><a href="availablepcsembed.php?branch=Duhig&room=Lvl2">Level 2</a></td> 
     <td class="middle"><div style="width:78%;"><strong>78%</strong></div></td> 
     <td class="right">83 Free of 107 PC's</td> 
    </tr> 

    <tr valign="middle"> 
     <td class="left"><a href="availablepcsembed.php?branch=Duhig&room=Lvl4">Level 4</a></td> 
     <td class="middle"><div style="width:64%;"><strong>64%</strong></div></td> 
     <td class="right">9 Free of 14 PC's</td> 
    </tr> 

    <tr valign="middle"> 
     <td class="left"><a href="availablepcsembed.php?branch=Duhig&room=Lvl5">Level 5</a></td> 
     <td class="middle"><div style="width:97%;"><strong>97%</strong></div></td> 
     <td class="right">28 Free of 29 PC's</td> 
    </tr> 
</table> 

Verkürzte Methode:

def self.scrape_details_page(library_url) 
    details_page = Nokogiri::HTML(open(library_url)) 

    library_name = details_page.css("h3") 

    details_page.css("table tr").collect do |level| 
     case level.css("a[href]").text.downcase 
      when "level 1" 
       name = level.css("a[href]").text 
       total_available = level.css(".right").text.split(" ")[0] 
       out_of_available = level.css(".right").text.split(" ")[3] 
       level = {name: name, total_available: total_available, out_of_available: out_of_available} 
      when "level 2" 
       name = level.css("a[href]").text 
       total_available = level.css(".right").text.split(" ")[0] 
       out_of_available = level.css(".right").text.split(" ")[3] 
       level = {name: name, total_available: total_available, out_of_available: out_of_available} 
     end 
    end 
end 

Antwort

1

Sie die Klasse Attribut der Tabelle angeben, und dann greifen die tr innerhalb von Tags, auf diese Weise Sie das vermeiden "zusätzliche" tr, wie:

details_page.css("table.chart tr").map do |level| 
    ... 

und ein wenig die scrape_details_page Verfahren vereinfachen:

def scrape_details_page(library_url) 
    details_page = Nokogiri::HTML(open(library_url)) 
    details_page.css('table.chart tr').map do |level| 
    right = level.css('.right').text.split 
    { name: level.css('a[href]').text, total_available: right[0], out_of_available: right[3] } 
    end 
end 

p scrape_details_page('https://www.library.uq.edu.au/uqlsm/availablepcsembed.php?branch=Duhig') 

# [{:name=>"Level 1", :total_available=>"22", :out_of_available=>"34"}, 
# {:name=>"Level 2", :total_available=>"98", :out_of_available=>"107"}, 
# {:name=>"Level 4", :total_available=>"12", :out_of_available=>"14"}, 
# {:name=>"Level 5", :total_available=>"26", :out_of_available=>"29"}] 
Verwandte Themen