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í:

    1. 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.

    1. 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 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.text

    Crear 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