Un ejemplo práctico de cómo podemos usar BeautifulSoup y Pandas para hacer limpieza y manipulación de datos en una página web. En este caso, vamos a extraer información de un sitio web de reseñas de películas (www.imdb.com), en particular de las 100 mejores películas según la clasificación de los usuarios. Comenzaremos importando las librerías necesarias:
import requests
from bs4 import BeautifulSoup
import pandas as pd
Luego, hacemos una petición al sitio web para obtener el código HTML de la página:
url = 'https://www.imdb.com/chart/top'
response = requests.get(url)
html = response.content
Después, creamos un objeto Beautiful Soup que nos permite analizar y procesar el código HTML de la página:
soup = BeautifulSoup(html, 'html.parser')
A continuación, usamos Beautiful Soup para extraer los datos que nos interesan de la tabla que contiene la lista de las 100 mejores películas:
movies_table = soup.find('table', {'class': 'chart full-width'})
movies = movies_table.find_all('tr')[1:]
En este caso, estamos buscando la tabla que tiene la clase 'chart full-width' y obteniendo todas las filas de la tabla exceptuando la primera, que es simplemente la fila de encabezado.
Una vez que tenemos los datos en una lista de objetos BeautifulSoup, podemos iterar sobre ellos para obtener la información que deseamos:
titles = []
years = []
ratings = []
for movie in movies:
title = movie.find('td', {'class': 'titleColumn'}).find('a').text.strip()
year = movie.find('td', {'class': 'titleColumn'}).find('span').text.strip('()')
rating = float(movie.find('td', {'class': 'imdbRating'}).text.strip())
titles.append(title)
years.append(year)
ratings.append(rating)
En este caso, estamos extrayendo el título de la película, el año de lanzamiento y la calificación del usuario para cada una de las películas en la lista. Para limpiar los datos, estamos eliminando los espacios en blanco y los caracteres que no nos interesan.
Finalmente, podemos crear un objeto de Pandas DataFrame con los datos obtenidos y hacer cualquier manipulación y análisis adicional que deseemos:
imdb_df = pd.DataFrame({'title': titles, 'year': years, 'rating': ratings})
print(imdb_df.head())
Con esto, obtendremos una tabla de datos que podemos manipular y analizar como deseemos:
title year rating
0 Cadena perpetua 1994 9.2
1 El Padrino 1972 9.1
2El Padrino: Parte II 1974 9.0
3 El caballero de la noche 2008 9.0
4 12 hombres en pugna 1957 8.9