Использование BS4 У меня есть проблема при соскобе даты обзора Trustpilot - PullRequest
0 голосов
/ 28 января 2020

Учитывая мой код ниже, я не могу получить рейтинг и соответствующую дату.

Я могу получить рейтинг, но не использую .text. В результате получается целая вещь:

</div>, <div class="star-rating star-rating--medium">
<img alt="5 stars: Excellent" src="//cdn.trustpilot.net/brand-assets/4.1.0/stars/stars-5.svg"/>

Это означает, что у меня есть какая-то уборка, но я уверен, что можно получить только «5 звезд: Отлично». Просто не знаю, как это сделать.

Что касается дат, только моя строка "date = star.find (" div ", attrs = {" class ":" tooltip-container-1 "})" получает мне None значения, и я не уверен почему.

Пожалуйста, смотрите мне код, HTML для оценок и даты ниже.

Мой код:

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"}
#def get_total_items(url):

#soup = BeautifulSoup(requests.get(url, format(0),headers).text, 'lxml')
stars = []
dates = []
with requests.Session() as s: 
    for num in range(1,2):
        url = "https://www.trustpilot.com/review/www.boozt.com?page={}".format(num)
        r = s.get(url, headers = headers)
        soup = BeautifulSoup(r.content, 'lxml')

        for star in soup.find_all("section", attrs={"class":"review__content"}):
            rating = star.find("div", attrs={"class":"star-rating star-rating--medium"}) 
            date = star.find("div", attrs={"class":"tooltip-container-1"})
            #print(rating)
            stars.append(rating)
            dates.append(date)
        #data = {"Rating": stars, "Dates": dates}
        time.sleep(2)
print(dates) 

Рейтинг html от Trustpilot:

<div class="star-rating star-rating--medium">
    <img src="//cdn.trustpilot.net/brand-assets/4.1.0/stars/stars-5.svg" alt="5 stars: Excellent">
</div>

Дата html от Trustpilot:

<div class="v-popover">
    <span aria-describedby="popover_o7e1fd7whi" class="trigger" style="display: inline-block;">
        <time datetime="2020-01-20T10:09:54.000Z" title="Monday, January 20, 2020, 11:09:54 AM" class="review-date--tooltip-target">Jan 20, 2020</time> 
        <div class="tooltip-container-1"></div> <!----></span> </div>

Ответы [ 3 ]

1 голос
/ 28 января 2020

Во-первых, чтобы получить значение рейтинга, например, «5 звезд: Отлично», вам просто нужно прочитать атрибут alt из img в div с star-rating star-rating--medium классом

Затем, чтобы получить значение даты, это немного сложно, потому что целевая дата загружается на javascript. Но вы можете получить его из тега script чуть выше. Например: star.find('script')

Я обновил ваш фрагмент кода, и вот мы:

КОД:

import requests
from bs4 import BeautifulSoup
import time
import json

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"}
#def get_total_items(url):

#soup = BeautifulSoup(requests.get(url, format(0),headers).text, 'lxml')
stars = []
dates = []
results = []
with requests.Session() as s:
    for num in range(1,2):
        url = "https://www.trustpilot.com/review/www.boozt.com?page={}".format(num)
        r = s.get(url, headers = headers)
        soup = BeautifulSoup(r.content, 'lxml')

        for star in soup.find_all("section", {"class":"review__content"}):

            # Get rating value
            rating = star.find("div", {"class":"star-rating star-rating--medium"}).find('img').get('alt')

            # Get date value
            date_json = json.loads(star.find('script').text)
            date = date_json['publishedDate']

            stars.append(rating)
            dates.append(date)

            data = {"Rating": rating, "Date": date}
            results.append(data)

        time.sleep(2)


print(results)

РЕЗУЛЬТАТЫ:

[{'Date': '2020-01-28T05:37:13Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-28T00:00:48Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T23:22:58Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T21:20:32Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T21:06:42Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T19:37:16Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T19:27:38Z', 'Rating': '2 stars: Poor'},
 {'Date': '2020-01-27T18:20:48Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T17:18:42Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T16:15:17Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:58:49Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:46:29Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:39:23Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:32:43Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:29:21Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T15:27:30Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T14:35:29Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T13:43:40Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T13:37:53Z', 'Rating': '5 stars: Excellent'},
 {'Date': '2020-01-27T12:58:58Z', 'Rating': '5 stars: Excellent'}]
0 голосов
/ 28 января 2020

Измените для l oop на

for star in soup.find_all("section", attrs={"class":"review__content"}):
    rating = star.select("div.star-rating > img") 
    date_tag = star.select("div.review-content-header__dates > script")    
    date = json.loads(date_tag[0].text)
    dt = datetime.strptime(date['publishedDate'], "%Y-%m-%dT%H:%M:%SZ")
    stars.append(rating[0]['alt'])
    dates.append(dt)
0 голосов
/ 28 января 2020

Рейтинги находятся внутри тега изображения, а даты - внутри тега скрипта. Вам нужно получить текст тега scripts и загрузить в json, а затем получить значение ключа json.

Использовать следующий селектор css.

import json
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"}
stars = []
dates = []
with requests.Session() as s:
    for num in range(1,2):
        url = "https://www.trustpilot.com/review/www.boozt.com?page={}".format(num)
        r = s.get(url, headers = headers)
        soup = BeautifulSoup(r.content, 'lxml')
        for star in soup.find_all("section", attrs={"class":"review__content"}):
            rating = star.select_one(".star-rating.star-rating--medium >img")
            date = star.select_one(".review-content-header__dates > script").text
            date1=json.loads(date)
            stars.append(rating['alt'])
            dates.append(date1['publishedDate'])
        data = {"Rating": stars, "Dates": dates}

print(data)

Вывод :

{'Rating': ['5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '2 stars: Poor', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent', '5 stars: Excellent'], 'Dates': ['2020-01-28T05:37:13Z', '2020-01-28T00:00:48Z', '2020-01-27T23:22:58Z', '2020-01-27T21:20:32Z', '2020-01-27T21:06:42Z', '2020-01-27T19:37:16Z', '2020-01-27T19:27:38Z', '2020-01-27T18:20:48Z', '2020-01-27T17:18:42Z', '2020-01-27T16:15:17Z', '2020-01-27T15:58:49Z', '2020-01-27T15:46:29Z', '2020-01-27T15:39:23Z', '2020-01-27T15:32:43Z', '2020-01-27T15:29:21Z', '2020-01-27T15:27:30Z', '2020-01-27T14:35:29Z', '2020-01-27T13:43:40Z', '2020-01-27T13:37:53Z', '2020-01-27T12:58:58Z']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...