Как очистить рейтинг и дату на tripadvisor с помощью BeautifulSoup

Я пытаюсь получить некоторую информацию (комментарии, даты, рейтинги) от этого отеля на tripadvisor

Вот мой сценарий на данный момент:

import re
import json
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import datetime
import time
import random


root_url = 'https://www.tripadvisor.ca/Hotel_Review-g60982-d87016-Reviews-or'
urls = [ '{root}{i}-Hilton_Hawaiian_Village_Waikiki_Beach_Resort-Honolulu_Oahu_Hawaii.html'.format(root=root_url, i=i) for i in range(5,20,5) ]

comms = []
notes = []
dates = []


for url in urls: 
    results = requests.get(url)

    #time.sleep(20)

    soup = BeautifulSoup(results.text, "html.parser")

    commentary = soup.find_all('div', class_='oETBfkHU')

    for container in commentary:

        comm  = container.find('q', class_ = 'IRsGHoPm').text.strip()

        comms.append(comm)


        date_tag = container.find("span", class_ = "_355y0nZn").text.strip()

        dates.append(date_tag)

data = pd.DataFrame({
    'comms' : comms,
    'dates' : dates
    })



#print(data.head())
data.to_csv('file.csv', sep=';', index=False)

И вот мой вывод:

Я не удивлен, date_tag не совсем точно определен, но я не вижу, как выбрать правильный текст.

Вот html:

«Март 2020» вообще не имеет класса, поэтому я подумал, что если я укажу container.find("span", class_ = "_355y0nZn").text.strip(), это сработает, но это не так.

И последнее, я не знаю, как поставить рейтинг, давайте посмотрим html:

Как видите, текста нет вообще. Я думаю, что рейтинг работает с ui_bubble_rating bubble_50, где 50 - это рейтинг (5). Как это поцарапать? Такого строения я еще не видел.

Есть идеи ?

Спасибо :)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
575
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте приведенный ниже код, чтобы получить значение даты

date_tag = container.find("div", class_ = "_1O8E5N17").text 
date_text,date_value = str.split(date_tag,':')

Мне пришлось использовать дополнительную строку кода для преобразования bs4.element.ResultSet в строку

comm1 = str(container.find("div", class_ = "nf9vGX55").find('span'))
rat = re.findall(r'\d+', str(comm1))
rat1 = (str(rat))[2]
rating.append(rat1)

Спасибо ! Есть ли у вас советы о том, как получить рейтинги? :)

DouglasFalcon 22.12.2020 18:15

Максимальный рейтинг 50. В классе 'nf9vGX55' найдите имя класса span и используйте последние 2 цифры в качестве значения рейтинга. Пример ui_bubble_rating bubble_50 = 50, ui_bubble_rating bubble_40 = 40

Jethen 22.12.2020 19:16

Я попробую сам, но мне все равно нужен ваш код на всякий случай! :)

DouglasFalcon 23.12.2020 09:52

@DouglasFalcon - проверьте последний код. Надеюсь, вы получили ответ на оба вопроса

Jethen 23.12.2020 13:49

Часть с рейтингами у вас работает? Я получил "нет".

DouglasFalcon 23.12.2020 14:34

Хм, это работает, но когда я добавляю к своему notes = [] с notes.append(rating), он ничего не возвращает. Может быть, это потому, что он возвращает список?

DouglasFalcon 23.12.2020 14:38

Я отображал с помощью печати (рейтинг), и он предоставляет список со значениями «[50]», «[40]» и т. д.

Jethen 23.12.2020 15:51

Странно, я печатаю только одно значение: ['50'], поэтому при создании базы данных возникает конфликт формы.

DouglasFalcon 23.12.2020 16:27

Я узнаю, где была проблема. Я забыл удалить свой старый код для notes, поэтому я думаю, что это был конфликт! Большое спасибо за вашу помощь. Проголосовал и отметил. Хорошего дня, сэр :)

DouglasFalcon 23.12.2020 17:24

Кстати, у вас есть идея, как преобразовать это ['50'] в целое число 5? Для дальнейшего анализа. Спасибо

DouglasFalcon 23.12.2020 17:29

Давайте продолжим обсуждение в чате.

Jethen 23.12.2020 17:30

Добро пожаловать. Позвольте мне попытаться получить одну цифру как 5 или 4

Jethen 23.12.2020 17:38

rat = re.findall(r'\d+', str(comm1)), rat1 = (str(rat))[2], rating.append(str(rat))

Jethen 23.12.2020 17:50

Вроде не работает, но может я что-то не так делаю

DouglasFalcon 23.12.2020 17:55

rat = re.findall(r'\d+', str(comm1)),rat1 = (str(rat))[2],rating.append(rat1) это должно работать любой ценой

Jethen 23.12.2020 18:52

Да работает! Потрясающий ! Спасибо, вы милы :) Проголосовал. Не забудьте отредактировать исходный пост для оценки!

DouglasFalcon 23.12.2020 22:43

Другие вопросы по теме