Это хитроумно, и вот как я это поцарапал. Вы должны использовать Selenium, но не BeautifulSoup из-за JavaScript. Я использую FireFox и Geckodriver версии 0.24.
Вам также придется вызвать неявное ожидание, чтобы позволить загрузке страницы завершиться в соответствии с версией, которую вы видите, когда нажимаете источник страницы в своем браузере. Чтобы понять почему, прочитайте этот абзац
/ ** * Получите источник последней загруженной страницы. Если страница была изменена после загрузки (например, * с помощью Javascript), нет никакой гарантии, что возвращаемый текст соответствует тексту измененной * страницы. Пожалуйста, обратитесь к документации конкретного используемого драйвера, чтобы определить, отражает ли * возвращаемый текст текущее состояние страницы или последний текст, отправленный веб-сервером *. Возвращенный источник страницы является представлением базовой DOM: не ожидайте, что он будет * отформатирован или экранирован так же, как ответ, отправленный с веб-сервера. Думайте об этом * как о впечатлении художника. *
от Исходный код селена .
Код
import os
import requests
from bs4 import BeautifulSoup
import lxml
from selenium import webdriver
url = 'https://www.skyscanner.it/trasporti/voli/berl/amst/191231/200102/?adultsv2=1&childrenv2=&cabinclass=economy&rtn=1&preferdirects=true&outboundaltsenabled=false&inboundaltsenabled=false&qp_prevProvider=ins_browse&qp_prevCurrency=EUR&priceSourceId=taps-taps&qp_prevPrice=116#/'
driver = webdriver.Firefox(executable_path=r'(put your path here)\geckodriver-v0.24.0-win64\geckodriver.exe')
driver.get(url)
#there will be differences in div id='app-root'
#in page_selenium.txt with and without implicit wait
driver.implicitly_wait(10)
#with selenium
html_selenium = driver.page_source
bs_selenium = BeautifulSoup(html_selenium, 'lxml')
with open('page_selenium.txt', 'w', encoding='utf-8') as outfile:
outfile.write(bs_selenium.prettify())
#with requests
html_req = requests.get(url)
bs_req = BeautifulSoup(html_req.text,'lxml')
with open('page_bs.txt', 'w', encoding='utf-8') as outfile:
outfile.write(bs_req.prettify())
#open and compare div id='app-root' in page_selenium.txt and page_bs.txt and you will understand why your method didn't work
#now scrape using the bs from selenium
spanner = bs_selenium.find_all('span',{'class':'BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk'})
print(spanner)
#terminate the browser
os.system('tskill plugin-container')
driver.close()
driver.quit()
Выход
[<span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 99</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 99</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 172</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 99</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 99</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 99</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 115</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 115</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 115</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 136</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 136</span>, <span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk">€ 136</span>]