Проблема с очисткой рейтинга etoil с помощью BeautifulSoup

Я пытаюсь собрать некоторую информацию на этом сайте: https://fr.trustpilot.com/review/jardiland.com

Вот мой сценарий на данный момент:

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)

И вот мой результат: выход

Я получил комментарий, но не рейтинг, я не совсем понимаю, как его получить.

Вот источник кода: источник кода

Я хотел бы иметь: «1 étoile: mauvais», но структура сложна.

Любые идеи, как это сделать?

Спасибо.

🤔 А знаете ли вы, что...
Python является интерпретируемым языком программирования.


58
1

Ответ:

Решено

Пара вещей, которые нужно исправить здесь:

  1. чтобы получить оценки, связанные с обзором, я бы взял родительский тег (на самом деле он на 2 уровня выше) из 'p', class_='review-content__text'. Таким образом, в этом элементе вы можете получить текст обзора и рейтинг.

Рейтинг — это не текст, а изображения. Таким образом, вы можете взять тег <img> и посмотреть на атрибут alt, чтобы получить его, который дает вам звезды / рейтинги.

  1. Вам нужно data = pd.DataFrame({ 'comms' : comms, 'notes' : notes}) быть вне цикла URL-адресов. В противном случае каждая страница будет перезаписывать фрейм данных из предыдущей итерации.

Код:

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)

Выход:

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]