Я пытаюсь получить некоторую информацию (комментарии, даты, рейтинги) от этого отеля на 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). Как это поцарапать? Такого строения я еще не видел.
Есть идеи ?
Спасибо :)
Используйте приведенный ниже код, чтобы получить значение даты
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)
Максимальный рейтинг 50. В классе 'nf9vGX55' найдите имя класса span и используйте последние 2 цифры в качестве значения рейтинга. Пример ui_bubble_rating bubble_50 = 50, ui_bubble_rating bubble_40 = 40
Я попробую сам, но мне все равно нужен ваш код на всякий случай! :)
@DouglasFalcon - проверьте последний код. Надеюсь, вы получили ответ на оба вопроса
Часть с рейтингами у вас работает? Я получил "нет".
Хм, это работает, но когда я добавляю к своему notes = []
с notes.append(rating)
, он ничего не возвращает. Может быть, это потому, что он возвращает список?
Я отображал с помощью печати (рейтинг), и он предоставляет список со значениями «[50]», «[40]» и т. д.
Странно, я печатаю только одно значение: ['50'], поэтому при создании базы данных возникает конфликт формы.
Я узнаю, где была проблема. Я забыл удалить свой старый код для notes
, поэтому я думаю, что это был конфликт! Большое спасибо за вашу помощь. Проголосовал и отметил. Хорошего дня, сэр :)
Кстати, у вас есть идея, как преобразовать это ['50'] в целое число 5? Для дальнейшего анализа. Спасибо
Давайте продолжим обсуждение в чате.
Добро пожаловать. Позвольте мне попытаться получить одну цифру как 5 или 4
rat = re.findall(r'\d+', str(comm1)), rat1 = (str(rat))[2], rating.append(str(rat))
Вроде не работает, но может я что-то не так делаю
rat = re.findall(r'\d+', str(comm1)),rat1 = (str(rat))[2],rating.append(rat1) это должно работать любой ценой
Да работает! Потрясающий ! Спасибо, вы милы :) Проголосовал. Не забудьте отредактировать исходный пост для оценки!
Спасибо ! Есть ли у вас советы о том, как получить рейтинги? :)