es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 bucle for 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 BeautifulSoup bsObj:

    table = bsObj.find('table', {'class': 'wikitable sortable'})
    

    Este código encuentra la tabla con la clase wikitable sortable y la asigna a la variable table. Con este paso agregado, el bucle for encontrará correctamente los nombres de los países para la variable countries en la posición columns[1]:

    countries = columns[0].text.strip()
    hdi_score = columns[2].text.strip()
    

    Con estos cambios, el código ahora debería cargar correctamente los datos en el DataFrame df con las columnas Countries y HDI_score. Aquí está el código completo corregido:

    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')
    
    table = bsObj.find('table', {'class': 'wikitable sortable'})
    
    df = pd.DataFrame(columns=['Countries', 'HDI_score'])
    for row in table.find_all('tr'):    
        columns = row.find_all('td')
    
        if(columns != []):
            countries = columns[0].text.strip()
            hdi_score = columns[2].text.strip()
            df = df.append({'Countries': countries, 'HDI_score': hdi_score}, ignore_index=True)
    
    print(df)
    

Comments are closed.