【问题标题】:Trouble to scrape etoile rating with BeautifulSoup用 BeautifulSoup 刮掉星辰评级的麻烦
【发布时间】:2020-12-16 11:40:04
【问题描述】:

我正在尝试在这个网站上抓取一些信息: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)

这是我的结果:output

我得到了评论但没有得到评分,我不太清楚如何获得它。

这里是代码源:codesource

我想要:“1 étoile : mauvais”,但结构很棘手。

任何想法如何做到这一点?

谢谢。

【问题讨论】:

    标签: python html python-3.x web-scraping beautifulsoup


    【解决方案1】:

    这里需要解决一些问题:

    1. 要获得与评论相关的评分,我实际上会从'p', class_='review-content__text' 中获取父标签(实际上是2 级)。这样,您就可以在该元素中获取评论文本并获取评分。

    评分不是实际的文字,而是图像。因此,您可以获取<img> 标签,然后查看alt 属性来获取它,它会为您提供星级/评级。

    1. 您需要data = pd.DataFrame({ 'comms' : comms, 'notes' : notes}) 位于网址循环之外。否则每个页面都会覆盖上一次迭代的数据帧。

    代码:

    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]
    

    【讨论】:

    • 非常感谢这个精彩的答案,我会尽快检查:)
    • 它有效!谢谢。你有什么想法可以摆脱我的 urls 列表而没有吗?因为当你有 8 页时,没关系,但是当你有超过 100 页时,那就很乏味了。
    • 我试过这个“for i in range(2,8) : results = requests.get("fr.trustpilot.com/review/jardiland.com?page={i}")”但它不起作用,那就是覆盖。跨度>
    • 不知道为什么你的不起作用。但是您可以使用相同的想法来制作网址列表。见上文
    • 它有效!谢谢 !!是的,我也没有,我想我放错了地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多