J'ai essayé d'obtenir la population mondiale à partir de ce site Web: https: //www.worldometer .info / population-mondiale / mais je ne peux obtenir que le code html, pas les données des nombres réels.
J'ai déjà essayé de trouver des enfants de l'objet dont j'ai essayé d'obtenir des données. J'ai aussi essayé de lister tout l'objet, mais rien ne semblait fonctionner.
'' 'juste importer des trucs' ''
(span class="rts-counter" rel="current_population">(span class="rts-nr-sign"></span>(span class="rts-nr-int rts-nr-10e9">7</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e6">703</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e3">227</span><span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e0">630</span></span>
'' 'obtenir du HTML du site Web au texte' ''
(span class="rts-counter" rel="current_population">retrieving data... </span>
'' 'ici, il ne trouve qu'un seul objet qui est répertorié ci-dessous '' '
current_population = soup.find('div',{'class':'maincounter-number'}).find_all('span', recursive=False)
print(current_population)
Voici l'objet dans lequel les informations sont stockées:
r = requests.get('https://www.worldometers.info/world-population/')
soup = BeautifulSoup(r.text,'html.parser')
et en 'inspect-mode' vous pouvez voir ceci:
import urllib.request import requests from bs4 import BeautifulSoup
Je n'obtiens toujours que le premier, mais je veux obtenir le second depuis 'inspect-mode'.
Voici une image du mode d'inspection.
3 Réponses :
Le site Web que vous capturez est une application Web JavaScript. Le contenu de l'élément que vous voyez en mode d'inspection est le résultat de l'exécution d'un code JavaScript après le téléchargement de la page qui remplit cet élément. Avant l'exécution de JavaScript, l'élément ne contient que le texte "récupération des données ...", ce que vous voyez dans votre code Python. Ni la bibliothèque de requêtes Python ni BeautifulSoup n'exécutent JavaScript dans le HTML téléchargé - ils ne téléchargent et analysent que le HTML, et c'est pourquoi votre code ne voit que le texte initial.
Vous avez deux options:
Vous allez avoir besoin d'une méthode permettant l'exécution de javascript telle que le sélénium car ce nombre est configuré via un compteur généré dans ce script: https://www.realtimestatistics.net/rts/RTSp.js
from selenium import webdriver
d = webdriver.Chrome()
d.get('https://www.worldometers.info/world-population/')
print(d.find_element_by_css_selector('[rel="current_population"]').text)
Vous pouvez essayer d'écrire votre propre version de cela script javascript mais je ne le recommanderais pas.
Je n'avais pas besoin d'un condition d'attente explicite pour le script sélénium mais qui pourrait être ajoutée.
Je vous remercie! Cette méthode n'est pas très rapide, mais je ne pense pas qu'il y ait quelque chose à améliorer, non? En tout cas merci pour votre réponse :)
de rien. Sauf s'il existe une API dédiée qui serait plus rapide.
Javascript est rendu sur le DOM, donc Beautiful Soup ne fonctionnera pas comme vous le souhaitez.
Vous devrez créer quelque chose qui laisse s'exécuter javascript (par exemple: navigateur) pour pouvoir créer votre propre navigateur en utilisant QT4 ou le comme. Sentdex avait un bon tutoriel là-dessus:
https: // www. youtube.com/watch?v=FSH77vnOGqU
Sinon, vous pouvez utiliser Selenium:
from selenium import webdriver
import time
drive = webdriver.Firefox()
drive.get('https://www.worldometers.info/world-population/')
time.sleep(5)
html = driver.page_source
L'API sur laquelle ce site Web s'appuie est sous licence. Il y a forcément des API publiques qui ont ces données.