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