Почему не парсит html страницу?
Осваиваю Python и библиотеку Beautiful Soup. Хочу спарсить горячие предложения авиакомпании. Но в выводе не вижу текста, страница неправильно парсится. Помогите пожалуйста. Почему так ? Делаю так:
import requests
from bs4 import BeautifulSoup as BS
URL = 'https://s7.ru'
HEADERS = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36','accept':'*/*'}
r = requests.get(URL, headers = HEADERS)
html = BS(r.content, 'html.parser')
print(html)
for el in html.select('.special-offers__item'):
title = el.select('.special-offers__to')
print(title[0].text)
В итоге получаю ответ из скриптов, текста там нет. Помогите пожалуйста. Заранее большое спасибо.
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Информация подгружается после HTML средствами JavaScript, поэтому предлагаю вариант через selenium.
import time
import traceback
# pip install selenium
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
URL = 'https://www.s7.ru/'
# Чтобы окно с браузером не появлялось
options = Options()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)
try:
driver.implicitly_wait(5)
driver.get(URL)
print(f'Title: {driver.title!r}')
# Заметил, что без дополнительного ожидания у <from_el> не весь текст
time.sleep(10)
for item in driver.find_elements_by_css_selector('.special-offers__item'):
to_el = item.find_element_by_css_selector('.special-offers__to')
from_el = item.find_element_by_css_selector('.special-offers__from')
price_el = item.find_element_by_css_selector('.special-offers__price')
print(f'{to_el.text:15} | {from_el.text} | {price_el.text}')
"""
Новосибирск | из Магнитогорска, туда и обратно | от 12 200 ₽
Москва | из Магнитогорска, туда и обратно | от 18 681 ₽
Казань | из Магнитогорска, туда и обратно | Проверить цену
Красноярск | из Магнитогорска, туда и обратно | Проверить цену
Мирный | из Магнитогорска, туда и обратно | Проверить цену
Норильск | из Магнитогорска, туда и обратно | Проверить цену
"""
except:
print(traceback.format_exc())
finally:
driver.quit()