Я пытаюсь собрать некоторую информацию на этом сайте: 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 является интерпретируемым языком программирования.
Пара вещей, которые нужно исправить здесь:
'p', class_='review-content__text'
. Таким образом, в этом элементе вы можете получить текст обзора и рейтинг.Рейтинг — это не текст, а изображения. Таким образом, вы можете взять тег <img>
и посмотреть на атрибут alt
, чтобы получить его, который дает вам звезды / рейтинги.
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]