Tabla de extracción de Python de la página web

Salman Mehmood 21 junio 2023
  1. Tabla de extracción de Python de la página web
  2. Python extrae la tabla de la página web usando Pandas
  3. Python extrae la tabla de la página web usando lxml
Tabla de extracción de Python de la página web

El objetivo principal de este artículo es demostrar cómo se pueden extraer tablas de una página web usando Pandas y lxml en Python.

Tabla de extracción de Python de la página web

Los datos tienen una importancia significativa en esta era moderna, donde mucha información se procesa, almacena y extrae diariamente a un ritmo de alta frecuencia. Con respecto a eso, nuestro proyecto puede exigir que extraigamos datos de una determinada ubicación en línea, repositorio o página web.

Esto puede ser una posibilidad en numerosos casos de uso. Tal vez sea necesario acceder a un sitio de mantenimiento de registros públicos para extraer, procesar y almacenar datos por numerosas razones o extraer datos de nuestro repositorio.

Hay mejores formas de hacer esto, pero en aras de la simplicidad, supongamos que esta es la forma requerida.

Para abordar esta situación, debemos idear una solución que establezca la conexión a la página web, lea la página, encuentre tablas (si están presentes), las extraiga correctamente y las almacene en un formato adecuado. Esto es para que pueda ser procesado en nuestro programa.

La solución a este problema se puede abordar de múltiples maneras, dos de las cuales se mencionan a continuación:

Python extrae la tabla de la página web usando Pandas

Antes de continuar, asegúrese de tener instalados los siguientes módulos/paquetes:

  1. lxml
  2. html5lib
  3. Hermosa Sopa4

Puede instalar los paquetes mencionados con pip usando el siguiente comando:

pip install lxml html5lib BeautifulSoup4

Esto da la siguiente salida:

Collecting lxml
  Downloading lxml-4.9.1-cp310-cp310-win_amd64.whl (3.6 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 37.9 kB/s eta 0:00:00
Requirement already satisfied: html5lib in c:\program files\python310\lib\site-packages (1.1)
Collecting BeautifulSoup4
  Downloading beautifulsoup4-4.11.1-py3-none-any.whl (128 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 128.2/128.2 kB 29.0 kB/s eta 0:00:00
Requirement already satisfied: webencodings in c:\program files\python310\lib\site-packages (from html5lib) (0.5.1)
Requirement already satisfied: six>=1.9 in c:\program files\python310\lib\site-packages (from html5lib) (1.16.0)
Collecting soupsieve>1.2
  Downloading soupsieve-2.3.2.post1-py3-none-any.whl (37 kB)
Collecting requests
  Downloading requests-2.28.1-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 420.8 kB/s eta 0:00:00
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.12-py2.py3-none-any.whl (140 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.4/140.4 kB 1.0 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.4-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.5/61.5 kB 121.6 kB/s eta 0:00:00
Collecting charset-normalizer<3,>=2
  Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2022.9.24-py3-none-any.whl (161 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 161.1/161.1 kB 1.4 MB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests, soupsieve, lxml, BeautifulSoup4
Successfully installed BeautifulSoup4-4.11.1 lxml-4.9.1 soupsieve-2.3.2.post1 certifi-2022.9.24 charset-normalizer-2.1.1 idna-3.4 requests-2.28.1 urllib3-1.26.12

Después de que se hayan instalado los módulos necesarios, es hora de pasar a la parte de implementación.

Considere el siguiente código:

import requests
import pandas as pd

url = "https://www.ffiec.gov/census/report.aspx?year=2020&county=009&state=09&report=demographic"

html = requests.get(url).content
df_list = pd.read_html(html)
df = df_list[-1]
print(df)

Esto da la siguiente salida:

    Tract Code Tract Income Level Distressed or Under-served Tract  ...  Minority Population Owner Occupied Units 1- to 4- Family Units
1       1202.0           Moderate                                No  ...                 3040                  918                  2010
2       1251.0             Middle                                No  ...                  551                 1400                  1555
3       1252.0           Moderate                                No  ...                 2088                 1139                  1992
4       1253.0           Moderate                                No  ...                 2443                  728                  1814
..         ...                ...                               ...  ...                  ...                  ...                   ...
95      1714.0           Moderate                                No  ...                 1278                  141                   638
96      1715.0           Moderate                                No  ...                 2241                  396                  1274
97      1716.0             Middle                                No  ...                 1466                 1378                  1803
98      1717.0             Middle                                No  ...                  820                 1456                  1647
99      1751.0             Middle                                No  ...                  851                  669                  1240

[100 rows x 12 columns]

Es fácil extraer tablas de cualquier página web utilizando la biblioteca de Pandas. El método read_html de la biblioteca Pandas se puede utilizar para leer y extraer datos de páginas web y luego convertirlos en marcos de datos para ayudar en el procesamiento fluido de los datos, ya que se convierten en objetos Dataframe.

Las tablas extraídas también se pueden guardar en un archivo CSV utilizando el método to_csv, que guarda el objeto Dataframe en un archivo CSV.

Python extrae la tabla de la página web usando lxml

Considere el siguiente código:

from lxml import etree
import urllib.request

site = "https://www.ffiec.gov/census/report.aspx?year=2020&county=009&state=09&report=demographic"

hdr = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding": "none",
    "Accept-Language": "en-US,en;q=0.8",
    "Connection": "keep-alive",
}


request = urllib.request.Request(site, headers=hdr)
web = urllib.request.urlopen(request)
s = web.read()
html = etree.HTML(s)


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

# 'th' is inside first 'tr'
headers = [i.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:]]

for head in headers:
    print(head, end=" ")

print("")

for content in td_content:
    print(content)

Esto da la salida a continuación:

Tract Code Tract Income Level  Distressed or Under   Tract Median Family Income % 2020 FFIEC Est. MSA/MD non-MSA/MD Median Family Income 2020 Est. Tract Median Family Income 2015 Tract Median Family Income Tract Population Tract Minority % Minority Population Owner Occupied Units 1- to 4- Family Units
['1201.00', 'Middle', 'No', '93.64', '$91,800', '$85,962', '$75,611', '6013', '26.44', '1590', '1862', '2248']
['1202.00', 'Moderate', 'No', '68.12', '$91,800', '$62,534', '$55,000', '6783', '44.82', '3040', '918', '2010']
['1251.00', 'Middle', 'No', '109.80', '$91,800', '$100,796', '$88,654', '4477', '12.31', '551', '1400', '1555']
['1252.00', 'Moderate', 'No', '62.55', '$91,800', '$57,421', '$50,506', '5912', '35.32', '2088', '1139', '1992']
['1253.00', 'Moderate', 'No', '57.28', '$91,800', '$52,583', '$46,250', '5164', '47.31', '2443', '728', '1814']
.
.
.
.
.

También es posible utilizar lxml y urllib para extraer tablas de una página web y procesarlas. Como se desprende del código, debemos proporcionar un encabezado personalizado a la solicitud; en caso contrario, se recibe un error 403: Prohibido.

Después de que la solicitud sea exitosa, se realiza una búsqueda de la tabla (específicamente para este sitio), luego de lo cual extraemos manualmente los encabezados y el contenido (filas) de la tabla.

Aunque esta opción es un poco más larga y compleja que el módulo de Pandas, es útil cuando se requiere más control y libertad sobre qué extraer y qué no.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn