Tabla de extracción de Python de la página web
- Tabla de extracción de Python de la página web
- Python extrae la tabla de la página web usando Pandas
-
Python extrae la tabla de la página web usando
lxml
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:
lxml
html5lib
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.
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