42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
|
import requests
|
||
|
from bs4 import BeautifulSoup
|
||
|
import json
|
||
|
|
||
|
url = 'https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States'
|
||
|
response = requests.get(url)
|
||
|
soup = BeautifulSoup(response.text, 'html.parser')
|
||
|
|
||
|
# Encuentra la tabla por su clase
|
||
|
table = soup.find('table', {'class': 'wikitable'})
|
||
|
|
||
|
# Encuentra todas las filas en la tabla
|
||
|
rows = table.find_all('tr')
|
||
|
|
||
|
# Extrae los encabezados de la primera fila
|
||
|
headers = [header.get_text().strip()
|
||
|
for header in rows[0].find_all(['th', 'td'])]
|
||
|
|
||
|
# Inicializa una lista para almacenar los datos
|
||
|
data = []
|
||
|
|
||
|
# Itera a través de las filas a partir de la segunda (índice 1)
|
||
|
for row in rows[1:]:
|
||
|
# Encuentra todas las celdas en la fila
|
||
|
cells = row.find_all(['th', 'td'])
|
||
|
|
||
|
# Verifica que haya celdas suficientes en la fila
|
||
|
if cells and len(cells) >= len(headers):
|
||
|
president = {}
|
||
|
for i, header in enumerate(headers):
|
||
|
# Asigna el valor de la celda al encabezado correspondiente
|
||
|
cell_data = cells[i].find(string=True) if cells[i].find(
|
||
|
string=True) else cells[i].find('a')['title'].strip()
|
||
|
president[header.lower()] = cell_data
|
||
|
data.append(president)
|
||
|
|
||
|
# Guarda los datos como JSON
|
||
|
with open('us_presidents.json', 'w') as f:
|
||
|
json.dump(data, f, indent=2)
|
||
|
|
||
|
print("Datos guardados en us_presidents.json")
|