tag scraping parse python python-3.x web-scraping beautifulsoup python-requests

scraping - ¿Cómo raspar la tabla html solo después de cargar datos usando Python Requests?



python parse table html (2)

Tendrá que usar algo como selenium para obtener el html. Sin embargo, podría continuar usando BeautifulSoup para analizarlo de la siguiente manera:

from bs4 import BeautifulSoup from operator import itemgetter from selenium import webdriver url = "http://www.oddsportal.com/soccer/england/premier-league/everton-arsenal-tnWxil2o#over-under;2" browser = webdriver.Firefox() browser.get(url) soup = BeautifulSoup(browser.page_source) data_table = soup.find(''div'', {''id'': ''odds-data-table''}) for div in data_table.find_all_next(''div'', class_=''table-container''): row = div.find_all([''span'', ''strong'']) if len(row): print '',''.join(cell.get_text(strip=True) for cell in itemgetter(0, 4, 3, 2, 1)(row))

Esto mostraría:

Over/Under +0.5,(8),1.04,11.91,95.5% Over/Under +0.75,(1),1.04,10.00,94.2% Over/Under +1,(1),1.04,11.00,95.0% Over/Under +1.25,(2),1.13,5.88,94.8% Over/Under +1.5,(9),1.21,4.31,94.7% Over/Under +1.75,(2),1.25,3.93,94.8% Over/Under +2,(2),1.31,3.58,95.9% Over/Under +2.25,(4),1.52,2.59,95.7%

Actualización : según lo sugerido por @JRodDynamite, para ejecutar el PhantomJS sin cabeza se puede usar en lugar de Firefox . Para hacer esto:

  1. Descargue el binario PhantomJS Windows .

  2. Extraiga el ejecutable phantomjs.exe y asegúrese de que esté en su RUTA.

  3. Cambie la siguiente línea: browser = webdriver.PhantomJS()

Estoy tratando de aprender a raspar datos usando Python y he estado usando las bibliotecas Requests y BeautifulSoup4. Funciona bien para sitios web normales. Pero cuando traté de obtener algunos datos de sitios web donde los datos de la tabla se cargan después de un retraso, descubrí que obtengo una tabla vacía. Un ejemplo sería esta página web

El script que he probado es bastante rutinario.

import requests from bs4 import BeautifulSoup response = requests.get("http://www.oddsportal.com/soccer/england/premier-league/everton-arsenal-tnWxil2o#over-under;2") soup = BeautifulSoup(response.text, "html.parser") content = soup.find(''div'', {''id'': ''odds-data-portal''})

La carga de datos en la tabla odds-data-portal en la página pero el código no me da eso. ¿Cómo puedo asegurarme de que la tabla esté cargada con datos y obtenerla primero?


Lo siento, no puedo abrir el enlace. Pero la tabla probablemente se genera en una de 2 maneras:

  1. Puramente por JavaScript sin llamada AJAX.
  2. Usando una llamada AJAX y algo de JavaScript para la manipulación DOM.

Si es el primer caso, entonces no tienes más opción que usar selenium-webdriver en Python . Además, puedes echar un vistazo al ejemplo en esta respuesta .

Si es el segundo caso, puede averiguar la URL y los datos enviados y luego usar el módulo de requests enviar una solicitud similar para recuperar los datos. Los datos pueden estar en formato JSON o HTML (Depende de qué tan bueno sea el desarrollador). Tendrás que analizarlo en consecuencia.

A veces, la llamada AJAX puede requerir, como datos, un token CSRF o la cookie, en ese caso deberá volver a la solución en el primer caso.