Problemas para raspar la calificación etoil con BeautifulSoup
Estoy tratando de sacar información de este sitio web: https://fr.trustpilot.com/review/jardiland.com
Aquí está mi guión hasta ahora:
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
urls = ["https://fr.trustpilot.com/review/jardiland.com",
"https://fr.trustpilot.com/review/jardiland.com?page=2",
"https://fr.trustpilot.com/review/jardiland.com?page=3",
"https://fr.trustpilot.com/review/jardiland.com?page=4",
"https://fr.trustpilot.com/review/jardiland.com?page=5",
"https://fr.trustpilot.com/review/jardiland.com?page=6",
"https://fr.trustpilot.com/review/jardiland.com?page=7",
"https://fr.trustpilot.com/review/jardiland.com?page=8"]
comms = []
notes = []
for url in urls :
results = requests.get(url)
soup = BeautifulSoup(results.text, "html.parser")
commentary = soup.find_all('p', class_='review-content__text')
for container in commentary:
comm = container.text
comms.append(comm)
ratings = soup.find_all('div', class_='star-rating star-rating--medium')
for container2 in ratings:
rating = container2.text
notes.append(rating)
data = pd.DataFrame({
'comms' : comms,
'notes' : notes})
data['comms'] = data['comms'].str.replace('\n', '')
#print(data.head())
data.to_csv('file.csv', sep=';', index=False)
Y aquí está mi resultado: Producto
Obtuve el comentario pero no la calificación, no puedo averiguar cómo obtenerlo.
Aquí está la fuente de código: codesource
Me gustaría tener : "1 étoile : mauvais" pero la estructura es difícil.
¿Alguna idea de cómo hacer esto?
Gracias.
Pregunta hecha hace 3 años, 5 meses, 0 días - Por logicluminary3c42
3 Respuestas:
-
Un par de cosas para arreglar aquí:
- para conseguir las calificaciones asociadas con la revisión, yo realmente tomaría la etiqueta padre (en realidad es 2 niveles arriba) de la
'p', class_='review-content__text'
. De esa manera dentro de ese elemento, usted puede entonces agarrar el texto de revisión, y agarrar la calificación.
La calificación no es texto real, son imágenes. Así que puedes agarrar el
y mira el
alt
atributo para conseguir eso, que le da estrellas/ratings.- Necesitas
data = pd.DataFrame({ 'comms' : comms, 'notes' : notes})
para estar fuera del bucle de urls. De lo contrario cada página va a sobreescribir el marco de datos de la iteración anterior.
Código:
import requests from requests import get from bs4 import BeautifulSoup import pandas as pd import numpy as np root_url = 'https://fr.trustpilot.com/review/jardiland.com' urls = [ '{root}?page={i}'.format(root=root_url, i=i) for i in range(1,9) ] comms = [] notes = [] for url in urls : results = requests.get(url) soup = BeautifulSoup(results.text, "html.parser") commentary = soup.find_all('div', class_='review-content') for container in commentary: comm = container.find('p', class_='review-content__text').text.strip() comms.append(comm) rating = container.find('div', class_='star-rating star-rating--medium').find('img')['alt'] notes.append(rating) data = pd.DataFrame({ 'comms' : comms, 'notes' : notes}) data['comms'] = data['comms'].str.replace('\n', '') #print(data.head()) data.to_csv('file.csv', sep=';', index=False)
Producto:
print (data) comms notes 0 Suite à un achat effectué fin novembre, j’ai e... 1 étoile : mauvais 1 Aujourd'hui dans le magasin de Beaucouzé Anger... 1 étoile : mauvais 2 A FUIR! Sur les deux commandes passée : - La p... 1 étoile : mauvais 3 Si vous avez une réclamation évitez le Jardila... 1 étoile : mauvais 4 Quelle honten ! J'ai acheté une nappe ce weeke... 1 étoile : mauvais .. ... ... 139 Pour moi c'est zéro, cher, personnel pas très ... 1 étoile : mauvais 140 J'ai acheté deux serres chauffantes avec therm... 3 étoiles : moyen 141 Magasin agréable à Maurepas.Vendeurs sympathiq... 5 étoiles : excellent 142 Il y a vraiment beaucoup de choix et c'est un ... 5 étoiles : excellent 143 Grâce à vos sélections mon jardin ressemble à ... 5 étoiles : excellent [144 rows x 2 columns]
Respondida el Dec 16, 2020 a las 11:45 - por syntaxsniper
Votos positivos: 0 | Votos negativos: 0 - para conseguir las calificaciones asociadas con la revisión, yo realmente tomaría la etiqueta padre (en realidad es 2 niveles arriba) de la
-
Para obtener la calificación (estrellas) de los comentarios en la página web que estás raspanndo, necesitas hacer algunos ajustes en tu código.
En lugar de buscar un div con la clase 'star-rating star-rating--medium', puedes encontrar la etiqueta 'img' que contiene el atributo 'alt' que tiene la información de las estrellas. Aquí te dejo una modificación en tu código para que puedas obtener la calificación junto con el comentario:
python
tu código hasta antes de obtener la información de calificación
...
ratings = soup.find_all('img', class_='star-rating-star-rating--medium') for container2 in ratings: rating = container2['alt'] notes.append(rating)tu código después de obtener la información de calificación
...
Con este ajuste, el código buscará todas las etiquetas 'img' con la clase 'star-rating-star-rating--medium' y obtendrá el texto del atributo 'alt', que contiene la información de las estrellas. De esta forma, podrás obtener tanto el comentario como la calificación de cada entrada en la página web.
Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 17, 2020 a las 11:50 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para extraer la calificación de estrellas del sitio web de Trustpilot utilizando BeautifulSoup, puedes utilizar el siguiente código:
python import requests from bs4 import BeautifulSoup import pandas as pd
URL del sitio web
url = "https://fr.trustpilot.com/review/jardiland.com"Obtener el contenido HTML de la página
response = requests.get(url) html_content = response.textCrear un objeto BeautifulSoup
soup = BeautifulSoup(html_content, "html.parser")Obtener todos los contenedores de calificación de estrellas
star_containers = soup.find_all("div", class_="star-rating star-rating--medium")Inicializar listas para almacenar calificaciones y comentarios
ratings = [] comments = []Iterar sobre los contenedores de calificación de estrellas
for container in star_containers:Obtener la calificación de estrellas como texto
rating = container.find("div", class_="star-rating__stars--static").get("aria-label") ratings.append(rating)Obtener todos los contenedores de comentarios
comment_containers = soup.find_all("p", class_="review-content__text")Iterar sobre los contenedores de comentarios
for container in comment_containers:Obtener el comentario como texto
comment = container.text comments.append(comment)Crear un DataFrame con las calificaciones y los comentarios
df = pd.DataFrame({ "Rating": ratings, "Comment": comments })Limpiar las calificaciones (eliminar espacios en blanco, etc.)
df["Rating"] = df["Rating"].str.strip()Convertir las calificaciones a formato numérico (si es necesario)
Este paso es opcional, pero puede ser útil para ciertas operaciones
df["Rating"] = df["Rating"].astype(float)
Guardar el DataFrame en un archivo CSV
df.to_csv("trustpilot_reviews.csv", index=False)Este código navegará por el sitio web de Trustpilot, extraerá las calificaciones de estrellas y los comentarios de cada página y los almacenará en un DataFrame de Pandas. Finalmente, el DataFrame se guardará en un archivo CSV para su posterior procesamiento.
Respondida el Dec 17, 2020 a las 11:57 - por Gemini
Votos positivos: 0 | Votos negativos: 0