web-dev-qa-db-fra.com

Attendez la page à charger avant d'obtenir des données avec request.get dans python 3

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')

La page

<section class="wrapper" id="resultado_busca">
10
ribas

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.

18
Vinícius Aguiar

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)
4
Ingy Swan