L'objectif du Scraper est d'analyser quels jeux de société ont obtenu le plus d'approbation et de les imprimer dans une liste triée. Fondamentalement, un dictionnaire de "nom : bravo". Voici la liste des jeux que je veux trier : https://boardgamegeek.com/geeklist/ 268396/20-jeux-les-plus-anticipés-2020-11th-year-noinatio

J'utilise Framework Scrapy en Python. J'ai trouvé que les commandes suivantes sont bonnes pour extraire le titre et les pouces vers le haut :

response.css('.fl > a:nth-child(2)::text').getall()
response.css('.recs a::text').getall()

Le problème se pose lorsqu'un jeu a 0 pouce, alors Scrapy saute simplement ce pouce vers le haut. Ce qui signifie que la liste des titres est plus que la liste des pouces levés. Par exemple, je pourrais obtenir une liste de 25 titres et juste une liste de 20 pouces avec les commandes ci-dessus. Existe-t-il un moyen de convertir des chaînes vides en une valeur par défaut de 0 afin que la liste des noms et la liste des approbations soient égales ? Comme:

response.css('.recs a::text').getall(default="0")

Lorsqu'il n'y a pas de pouce levé, cela ressemble à ceci :

<a aria-label="Recommendations and tip info" class="js-score" href="javascript://" onclick="RecSpy( 'listitem', '7520669', 'tippers' ); return false;"></a>
2
crystal 9 févr. 2020 à 11:37

1 réponse

Meilleure réponse

Au lieu de collecter chaque jeu de société et leurs goûts séparément du DOM principal, vous pouvez à la place récupérer chaque sélecteur qui contient à la fois les goûts et le nom du jeu de société, par ex.

games = response.css('.mb5') # fetch every selector with class "mb5"
for game in games:
  name = game.css('.fl > a:nth-child(2)::text').get()
  likes = game.css('.recs a::text').get() or 0
  ...

Pseudo-code, mais j'espère que vous voyez l'idée.

0
Krisz 9 févr. 2020 à 19:19