2017-02-19 1 views
1

J'ai écrit un petit script pour extraire les noms d'utilisateurs de Github. Je peux obtenir le premier détails de nom d'utilisateur, mais je ne comprends pas comment je peux parcourir une liste d'éléments avec la même classe de sélecteur CSS pour mettre une liste des noms d'utilisateur ainsi:Comment parcourir les étiquettes li et collecter leurs valeurs avec Nokogiri

page = agent.get('https://github.com/angular/angular/stargazers') 

html_results = Nokogiri::HTML(page.body) 

first_username = html_results.at_css('.follow-list-name').text 

first_username_location = html_results.at_css('.follow-list-info').text 

Pouvez-vous me aider comprendre comment je peux parcourir tous les éléments follow-list-... dans le page.body et stocker les valeurs dans un tableau quelque part?

Répondre

1

Nokogiri at_css renvoie un unique (premier). Utilisez css place pour obtenir un tableau des résultats correspondant à:

require 'nokogiri' 
require 'open-uri' 
require 'pp' 

html = Nokogiri::HTML(open('https://github.com/angular/angular/stargazers').read) 

usernames = html.css('.follow-list-name').map(&:text) 
locations = html.css('.follow-list-info').map(&:text) 

pp usernames 
pp locations 

Sortie:

["Jeff Arese Vilar", 
"Yaroslav Dusaniuk", 
"Matthieu Le brazidec", 
    ... ] 

[" @Wallapop ", 
" Ukraine, Vinnytsia", 
" Joined on Jul 4, 2014", 
... ] 

noter que juste pour analyser le reste des membres dont vous aurez besoin pour gérer la pagination. C'est à dire. extraire les données de toutes les autres pages avec:

http://github.com/.../stargazers?page=NN 

... où NN est le numéro de page.

Utilisation de l'API Github

Une façon beaucoup plus robuste est d'utiliser l'API Liste Stargazers Github: https://developer.github.com/v3/activity/starring/#list-stargazers

+0

Merci Casper, très apprécié. – jbk

+0

Dit plus correctement, 'at _...' renvoie un Node et 'css',' xpath' ou 'search' retourne un NodeSet. Un NodeSet agit beaucoup comme un tableau de nœuds. –