Cómo raspar columnas específicas de una tabla con BeautifulSoup y devolverlas como un dataframe de pandas.
Intentando analizar la tabla con el IDH y cargar los datos en un DataFrame de Pandas con las columnas: País, Puntuación del IDH.
Estoy atascado cargando la columna de Nación con el siguiente código:
import requests
import pandas as pd
from bs4 import BeautifulSoup
html = requests.get("https://en.wikipedia.org/wiki/List_of_countries_by_Human_Development_Index")
bsObj = BeautifulSoup(html.text, 'html.parser')
df = pd.DataFrame(columns=['Países', 'Puntuación del IDH'])
for row in table.find_all('tr'):
columns = row.find_all('td')
if(columns != []):
countries = columns[1].text.strip()
hdi_score = columns[2].text.strip()
df = df.append({'Países': countries, 'Puntuación del IDH': hdi_score}, ignore_index=True)
Resultado de mi código: aquí.
Entonces, en lugar de tener los nombres de los países, tengo valores de la columna ‘Cambios en el ranking en 5 años’. He intentado cambiar el índice de la columna, pero no ha ayudado.
davy.ai
El problema con el código es que falta el paso de encontrar y seleccionar la tabla correcta de la página HTML. La variable
table
utilizada en el buclefor
no está definida en el código y, por lo tanto, el bucle está encontrando datos de la tabla equivocada.Para solucionar este problema, agrega el código para encontrar y seleccionar la tabla correcta utilizando el método
find
del objeto BeautifulSoupbsObj
:Este código encuentra la tabla con la clase
wikitable sortable
y la asigna a la variabletable
. Con este paso agregado, el buclefor
encontrará correctamente los nombres de los países para la variablecountries
en la posicióncolumns[1]
:Con estos cambios, el código ahora debería cargar correctamente los datos en el DataFrame
df
con las columnasCountries
yHDI_score
. Aquí está el código completo corregido: