J'ai une page dont j'ai besoin pour utiliser la source avec BS4, mais le milieu de la page prend 1 seconde (peut-être moins) pour charger le contenu, et request.get attrape la source de la page avant le chargement de la section, comment puis-je attendre une seconde avant d'obtenir les données?
r = requests.get(URL + self.search, headers=USER_AGENT, timeout=5 )
soup = BeautifulSoup(r.content, 'html.parser')
a = soup.find_all('section', 'wrapper')
<section class="wrapper" id="resultado_busca">
Il ne ressemble pas à un problème d'attente, il semble que l'élément soit créé par JavaScript, requests
ne peut pas gérer les éléments générés dynamiquement par JavaScript. Une suggestion est d'utiliser Selenium
avec PhantomJS
pour obtenir la source de la page, alors vous pouvez utiliser BeautifulSoup
pour votre analyse, le code ci-dessous fera exactement cela:
from bs4 import BeautifulSoup
from Selenium import webdriver
url = "http://legendas.tv/busca/walking%20dead%20s03e02"
browser = webdriver.PhantomJS()
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
a = soup.find('section', 'wrapper')
De plus, il n'est pas nécessaire d'utiliser .findAll
si vous ne recherchez qu'un seul élément.
Dans Python 3, l'utilisation du module urllib
en pratique fonctionne mieux lors du chargement de pages Web dynamiques que le module requests
.
c'est à dire
import urllib.request
try:
with urllib.request.urlopen(url) as response:
html = response.read().decode('utf-8')#use whatever encoding as per the webpage
except urllib.request.HTTPError as e:
if e.code==404:
print(f"{url} is not found")
Elif e.code==503:
print(f'{url} base webservices are not available')
## can add authentication here
else:
print('http error',e)