Je tente de racler des noms de rangs de Actuellement, je me débats avec mon expression de regex, car cela fonctionne bien pour faire correspondre le contenu (REGEX101), mais je ne sais pas comment je prends une expression de regex correspondante et Utilisez-le pour extraire les valeurs beaucoup. P> Quand je gratte, je peux altérer la rue à trouver pour assortir avec elle (et recevez un résultat), mais je ne sais pas comment je vais de là et que je l'attribue à plusieurs reprises des valeurs retournées à la liste p> [AZ] + \ s + [a-za-z] code> dans l'expression de regex doit être renvoyé sur les coureurs de liste, de sorte que je peux alors Imprimez chaque nom du cavalier. P> p>
3 Réponses :
comme @dyz mentionné dans les commentaires La page Web est générée dynamiquement lorsque vous essayez de le télécharger avec URLIB, vous obtiendrez une page Web comme celle-ci:
P>
Mais si vous visitez la même page Web via navigateur, vous obtiendrez tous les coureurs et les rangs affichés, car les navigateurs exécutent des scripts Java que les téléchargeurs comme Urllib ou les demandes ne font pas P>
Vous devez rechercher une autre méthode si vous avez besoin d'informations à partir de ce site ou que vous pouvez essayer magnifiquesoups si vous souhaitez simplement apprendre la raclée Web p>
Il est clair que les éléments que vous souhaitez capturer sont générés de manière dynamique. Ainsi, vous avez besoin sortie: p> sélénium code>. De votre description, vous voulez avoir le nom des coureurs. Tout d'abord, vous devez télécharger le ChromeRiver qui correspond à la version de votre chrome. Ensuite, essayez ce code:
Vous pouvez imiter la demande postale de la page, ce qui est plus rapide que d'utiliser un navigateur
import requests
headers = {'User-Agent' : 'Mozilla/5.0',
'Referer' : 'https://dataride.uci.ch/Results/iframe/RankingDetails/119?disciplineId=8&groupId=48&momentId=39994&disciplineSeasonId=139&rankingTypeId=1&categoryId=22&raceTypeId=71'}
data = {
'rankingId' : 119,
'disciplineId' : 8,
'currentRankingTypeId' : 1,
'rankingTypeId' : 1,
'take' : 40,
'skip' : 0,
'page' : 1,
'pageSize' : 40,
'filter[filters][0][field]' : 'RaceTypeId',
'filter[filters][0][value]' : 71,
'filter[filters][1][field]' : 'CategoryId',
'filter[filters][1][value]' : 22,
'filter[filters][2][field]' : 'SeasonId',
'filter[filters][2][value]' : 139,
'filter[filters][4][value]' : 0
}
r = requests.post('https://dataride.uci.ch/Results/iframe/ObjectRankings/', headers = headers, data = data).json()
riders = [item['DisplayName'] for item in r['data']]
print(riders)
Pourquoi vous avez besoin de regex si vous pouvez gratter les noms du cavalier directement en fonction de la classe Tag?
Pouvez-vous inclure une version de travail de votre code? Vous avez une SyntaxError et un TypeError.
C'est parce que cela ne donne pas encore à une production, c'est ce que j'ai besoin d'aide, je n'ai certainement pas une erreur de syntaxe. Où est l'erreur de type (NVM le trouva-t-elle, je pense que c'était le 3ème paramètre sur Windowall, j'ai oublié de la coller sur le débordement de la pile)? Si je pouvais simplement utiliser la classe de balises, que dois-je modifier? Je ne connais que regex comme c'est ce que j'ai été chargé d'utiliser ici.
La page est générée dynamiquement. Vous ne pouvez pas le télécharger avec Urllib. Pensez à utiliser
sélénium code> ou un autre navigateur sans tête.