Python 使用BeautifulSoup刮取etoile额定值时出现问题
我试图在这个网站上搜集一些信息: 以下是我目前的脚本:Python 使用BeautifulSoup刮取etoile额定值时出现问题,python,html,python-3.x,web-scraping,beautifulsoup,Python,Html,Python 3.x,Web Scraping,Beautifulsoup,我试图在这个网站上搜集一些信息: 以下是我目前的脚本: 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/rev
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”,但结构很复杂
有什么办法吗
谢谢。这里有几个问题需要解决:
'p',class='review-content.\uu text'
中抓取父标签(实际上是2级以上)。这样,在该元素中,您就可以获取评论文本,并获取评级
标记,并查看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]
输出:
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]
非常感谢您的精彩回答,我会尽快检查:)它有效!谢谢你有什么办法摆脱我的URL列表而不使用它吗?因为当你有8个页面时,这是可以的,但是当你有>100个页面时,这是很乏味的。我尝试了这个“对于范围(2,8)中的I:results=requests.get({I}”)。但是它不起作用,这是覆盖。不确定为什么你的页面不起作用。但是你也可以用同样的想法来制作一个URL列表。看上面,它工作了!谢谢是的,我也是,我想我把东西放错地方了