Saltar al contenido

Cómo extraer tablas de sitios web en Python

Laura, miembro de este gran equipo, nos ha hecho el favor de redactar este escrito ya que conoce perfectamente el tema.

Solución:

Pandas puede hacer esto de inmediato, lo que le evita tener que analizar el html usted mismo. to_html() extrae todas las tablas de su html y las coloca en una lista de marcos de datos. to_csv() se puede usar para convertir cada marco de datos en un archivo csv. Para la página web en su ejemplo, la tabla relevante es la última, por eso usé df_list[-1] en el código de abajo.

import requests
import pandas as pd

url = 'http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500'
html = requests.get(url).content
df_list = pd.read_html(html)
df = df_list[-1]
print(df)
df.to_csv('my data.csv')

Es lo suficientemente simple como para hacerlo en una línea, si lo prefiere:

pd.read_html(requests.get().content)[-1].to_csv()

PD Solo asegúrate de tener lxml, html5liby BeautifulSoup4 paquetes instalados por adelantado.

Así que esencialmente quieres analizar html archivo para obtener elementos de él. Puede usar BeautifulSoup o lxml para esta tarea.

Ya tienes soluciones usando BeautifulSoup. Publicaré una solución usando lxml:

from lxml import etree
import urllib.request

web = urllib.request.urlopen("http://www.ffiec.gov/census/report.aspx?year=2011&state=01&report=demographic&msa=11500")
s = web.read()

html = etree.HTML(s)

## Get all 'tr'
tr_nodes = html.xpath('//table[@id="Report1_dgReportDemographic"]/tr')

## 'th' is inside first 'tr'
header = [i[0].text for i in tr_nodes[0].xpath("th")]

## Get text from rest all 'tr'
td_content = [[td.text for td in tr.xpath('td')] for tr in tr_nodes[1:]]

Recomendaría BeautifulSoup ya que tiene la mayor funcionalidad. Modifiqué un analizador de tablas que encontré en línea que puede extraer todas las tablas de una página web, siempre que no haya tablas anidadas. Parte del código es específico del problema que estaba tratando de resolver, pero debería ser bastante fácil de modificar para su uso. Aquí está el enlace pastbin.

http://pastebin.com/RPNbtX8Q

Podrías usarlo de la siguiente manera:

from urllib2 import Request, urlopen, URLError
from TableParser import TableParser
url_addr ='http://foo/bar'
req = Request(url_addr)
url = urlopen(req)
tp = TableParser()
tp.feed(url.read())

# NOTE: Here you need to know exactly how many tables are on the page and which one
# you want. Let's say it's the first table
my_table = tp.get_tables()[0]
filename = 'table_as_csv.csv'
f = open(filename, 'wb')
with f:
    writer = csv.writer(f)
    for row in table:
        writer.writerow(row)

El código anterior es un esquema, pero si usa el analizador de tablas del enlace pastbin, debería poder llegar a donde desea ir.

valoraciones y comentarios

Si entiendes que te ha resultado de provecho este artículo, agradeceríamos que lo compartas con otros desarrolladores de este modo contrubuyes a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *