Я просматриваю tripadvisor. Моя проблема прямо сейчас состоит в том, чтобы очистить Hotelstars (не средний пользовательский рейтинг [пузыри], а рейтинг класса отеля) данного отеля, и позже я столкнусь с проблемой, когда отзывы скрыты за «читать дальше». https://www.tripadvisor.com.ph/Hotel_Review-g8762949-d1085145-Reviews-El_Rio_y_Mar_Resort-San_Jose_Coron_Busuanga_Island_Palawan_Province_Mimaropa.html К счастью, я знаю, где данные, где их найти. На странице с этим тегом:
<script window.__WEB_CONTEXT={pageManifest:{"assets":[....
....
</script>
ищите здесь https://pastebin.com/Ww3ugxFR по запросу «Вид был фантастическим c !!» (пример скрытого текста) или «звездочка»: для Hotelstars.
Я хочу узнать, как получить доступ к этому тегу.
Вот мой пример того, как это не работает. Мне нужно узнать, как указать селектору CSS (или другому инструменту), как обращаться к этой спецификации c и как извлекать из нее данные. Здесь, в этом примере, я просто загружаю ответ и выполняю простой поиск по шаблону. Я предполагаю, что можно также загрузить его с помощью Json и извлечь оттуда, но я еще не уверен с Json. :
hotel_CONTEXT = response.css("script text=window.__WEB_CONTEXT ::attr(pageManifest)).extract()
pattern_hotelstar = re.compile(r'star":\["\d')
matches_hotelstar = pattern_hotelstar.findall(hotel_CONTEXT)
Hotel_stars = str(matches_hotelstar).split('"')[2].split("'")[0]
Очевидно, что я хочу достичь, возможно с BeautifulSoup ( Очистка веб-сайта с данными, скрытыми в разделе «Подробнее» ... однако при попытке репликации я получил ошибки с json), но в целом я бы предпочел решение с помощью Scrapy.
Андрей Кеселий предоставил отличное решение моей проблемы! Его код работает так хорошо, что я хочу полностью его понять! Вот то, что я думаю, чтобы понять из кода, и где я просто не понимаю его колдовства;):
data = re.search(r'window\.__WEB_CONTEXT__=(.*?});', html_text).group(1)
Андрей ищет весь html_text шаблон, который начинается с "window .__ WEB ..." ", расширяет шаблон на все символы (.), любое количество раз (*) не жадным образом (?) и заканчивается на"; ". Я не понимаю, почему существует группа захвата с} init и почему} не было просто помещено в конец, учитывая, что сценарий заканчивается на}; (как Андрей это узнал? Это общий шаблон для них или он распечатал всю страницу и посмотрел?). Я также не понимаю, почему это должно быть не жадное. Группа (1) выбрала все в пределах первого окна выхода парантезы. WEB_CONTEXT = out. Я предполагаю, что это как-то связано с загрузкой результата с помощью json. То же самое касается
data = data.replace('pageManifest', '"pageManifest"')
Затем Андрей создает функцию под названием traverse, которая позже будет заполнена выводом данных. В операторе if Андрей проверяет, является ли ввод словарем. На следующем этапе Андрей перебирает ключ (k) и значение (v) словаря. Если k == "проверяет", он возвращает значение. Если не "выход из функции" ?? Я тоже потерялся с elif и проверкой, является ли val списком ... В общем, каков результат v функции? Как мне изменить функцию, чтобы включить больше словарей для прокрутки, поскольку else уже занято этим yield from.
def traverse(val):
if isinstance(val, dict):
for k, v in val.items():
if k == 'reviews':
yield v
else:
yield from traverse(v)
elif isinstance(val, list):
for v in val:
yield from traverse(v)
Здесь Андрей просматривает обход (данные) (словарь, верно?). Поскольку у нас есть несколько обзоров на этой странице. Во вложенном l oop Андрей дает каждому словарю в рамках одного обзора имя r и с помощью dictonary_name ["key"] получает значение, которое хранится. Я прав?
for reviews in traverse(data):
for r in reviews:
print(r['userProfile']['displayName'])
print(r['title'])
print(r['text'])
print('Rating:', r['rating'])
print('-' * 80)
Простите за все эти ладьи ie вопросы.