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列表。看上面,它工作了!谢谢是的,我也是,我想我把东西放错地方了