Найти "Span" с определенным классом с BeautifulSoup - PullRequest
0 голосов
/ 05 октября 2019

Это то, что я хочу найти

Я пытаюсь найти все эти элементы:

<span class="BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk>

Я пытался использовать:

page = requests.get(URL, headers=headers)
soup = BeautifulSoup(page.content, 'html.parser')
spans = soup.findAll('span', {"class": "BpkText_bpk-text__2NHsO BpkText_bpk-text--lg__3vAKN BpkText_bpk-text--bold__4yauk"})

print(spans)

с ранее объявленными «URL» и «заголовками», но мне возвращается: «[]»

URL

Как я могу изменить свой код

1 Ответ

0 голосов
/ 06 октября 2019

Это хитроумно, и вот как я это поцарапал. Вы должны использовать 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>]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...