2017-07-28 1 views
0

J'ai un problème avec le raclage d'une table html. Voici le lien: https://www.basketball-reference.com/players/c/curryst01/gamelog/2016 (oui, c'est un fameux tutoriel introductif pour Ruby-scraping). Voici le code lié:Ruby Nokogiri HTML table de grattage avec le numéro CSS

doc = Nokogiri::HTML.parse(open(link)) 

# Get the biggest table 
big_table = doc.css("table").sort { |x,y| y.css("tr").count <=> x.css("tr").count }.first 

# Number of rows is 87, but there are 5 heads that I wanna remove 
big_table.css("tr").count 

# This doesn't remove heads 
big_table = big_table.select { |row| row.css("th").empty? } 

En fait en HTML (je ne sais rien sur le langage HTML et je suis en Ruby depuis 4 h) e est la balise pour en-tête, td est pour une cellule standard, et tr est juste une ligne. L'objectif était de supprimer l'en-tête, de sorte que le retour .empty si un ensemble de noeuds (ensemble de noeuds est comme le contenu d'un tag?) Est vide, cette dernière ligne de code devrait renvoyer uniquement les éléments tr. Mais ça ne marche pas, en fait le résultat est [].
Au lieu de cela, je remarque que: big_table.select{|row| row.css("td").empty?}.count était égal à 5 ​​... Donc, j'ai décidé de le faire:

big_table = big_table.select{|row| row.css("td").any?} et cela a bien fonctionné ...

Ma question est: pourquoi est-ce fonctionne ligne ? et pourquoi la première tentative a échoué? Peut-être que c'est quelque chose dans la structure HTML qui me manque ...

Merci!

+0

Je ne comprends pas: qu'est-ce que vous cherchez à extraire de la page? –

+0

J'essaie d'extraire les données de la première table. Voici la vidéo tutoriel que je suis https://www.youtube.com/watch?v=1UYBAn69Qrk&t=560s (commencez à 9min20 jusqu'à 11min20). J'ai copié exactement ce que ce gars a fait, et comme je l'ai mentionné le "row.css (td) vide?" ligne n'a pas fait le travail. Merci ! – Eliot

+1

Sans rapport avec votre question, alors que la recherche de la plus grande table est intéressante (j'utiliserais 'max_by' plutôt que' sort'), vous avez seulement besoin de trouver l'ID approprié puisque les ID sont uniques, ie 'big_table = doc.css ("#pgl_basic") '. –

Répondre

1

Jetons un coup d'oeil à big_table

> big_table.class 
=> Nokogiri::XML::NodeSet 

> big_table.size 
=> 1 

faire Enumerable#select contre big_table Alors tout d'abord, est probablement pas faire ce que vous attendez. Si, au lieu de capturer les lignes:

> rows = big_table.css("tr") 
> rows.count 
=> 87 

Maintenant, vous pouvez faire votre select sur les lignes. Prenons une ligne arbitraire et voir ce qu'il contient:

> rows[2].css("td").count 
=> 29 

> rows[2].css("th").count 
=> 1 

Ainsi, une ligne typique a 29 td éléments et un th. En fait, chaque ligne a au moins un th, ce qui explique pourquoi le css("th").empty? n'a rien renvoyé. Inversement, les lignes de toutes les en-têtes ne contiennent aucun élément td, c'est pourquoi ce que vous avez essayé a fonctionné.

+0

Un grand merci pour vos explications! :) C'est beaucoup plus clair maintenant. En passant, connaissez-vous un cours .pdf pour débuter avec ruby, les langues nokogiri (je commence vraiment dans les deux langues)? Merci encore ! :) – Eliot