Question

J'essaie de gratter un site Web de table avec mécaniser.Je veux gratter la deuxième rangée.

Quand je cours :

agent.page.search('table.ea').search('tr')[-2].search('td').map{ |n| n.text }

Je m'attendrais à ce que cela gratte toute la rangée.Mais au lieu de cela, il ne fait que gratter :["2011-02-17", "0,00"]

Pourquoi ne supprime-t-il pas toutes les colonnes de la ligne, mais uniquement la première et la dernière colonne ?

XPath :/html/body/center/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[2]/td/table/tbody/tr[2 ]

CHEMIN CSS :html corps centre table tbody tr td table tbody tr td table tbody tr td table.ea tbody tr td.total

La page ressemble à ceci :

<table><table><table>
<table width="100%" border="0" cellpadding="0" cellspacing="1" class="ea">
<tr>
    <th><a href="#">Date</a></th>
    <th><a href="#">One</a></th>    
    <th><a href="#">Two</a></th>    
    <th><a href="#">Three</a></th>     
    <th><a href="#">Four</a></th>    
    <th><a href="#">Five</a></th>        
    <th><a href="#">Six</a></th>        
    <th><a href="#">Seven</a></th>      
    <th><a href="#">Eight</a></th>
</tr>
<tr>
    <td><a href="#">2011-02-17</a></td>
    <td align="right">0</td>    
    <td align="right">0</td>    
    <td align="right">0,00</td>     
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">0</td>    
    <td align="right">0</td>        
    <td align="right">387</td>      
    <td align="right">0,00</td>     <!-- FOV -->
    <td align="right">0,00</td>
</tr>
<tr>
    <td class="total">Ialt</td>
    <td class="total" align="right">0</td>  
    <td class="total" align="right">40</td>     
    <td class="total" align="right">0,46</td>   
    <td class="total" align="right">2</td>      
    <td class="total" align="right">0</td>        
    <td class="total" align="right">0</td>      
    <td class="total" align="right">0</td>        
    <td class="total" align="right">3.060</td>      
    <td class="total" align="right">0,00</td>       
    <td class="total" align="right">18,58</td>
</tr>
</table>
</table></table></table>
Était-ce utile?

La solution

En utilisant le code Ruby suivant (https://gist.github.com/835603):

require 'mechanize'
require 'pp'

a = Mechanize.new { |agent|
  agent.user_agent_alias = 'Mac Safari'
}

a.get('http://binarymuse.net/table.html') do |page|
  pp page.search('table.ea').search('tr')[-2].search('td').map{ |n| n.text }
end

J'obtiens le résultat suivant :

["2011-02-17", "0", "0", "0,00", "0", "0", "0", "0", "387", "0,00", "0,00"]

Autres conseils

Je vous recommanderais de laisser Mechanize à des choses plus difficiles que de gratter une page.Vous pouvez utiliser Nokogiri beaucoup plus simple que d'utiliser Mechanize (mais bien sûr vous pouvez le faire avec) puisque vous pouvez simplement requête la page.

Essaye le!

ici est un lien vers une réponse concernant nokogiri

Personnellement, j'ai utilisé Mechanize lorsque j'avais besoin d'envoyer des formulaires et des trucs comme ça quoique il y a des tonnes d'autres utilisations !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top