Selenium Python пустой возврат после обновления страницы

#javascript #python #selenium #scrape

#javascript #python #selenium #очистить

Вопрос:

Я использую Selenium Python вместе с BeautifulSoup для очистки данных. Мне нужен HTML веб-сайта после нажатия кнопки «Live». Я получаю кнопку для нажатия, однако новый HTML мне не возвращается. Я думал, что html возвращается очень быстро после нажатия кнопки, поэтому я перевел режим ожидания. Но даже в этом случае он возвращает только пустой div класса ‘Collapsible__contentInner’.

 from bs4 import BeautifulSoup
from selenium import webdriver

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'https://www.365scores.com/pt-br/football'

web_r = requests.get(url)
web_soup = BeautifulSoup(web_r.text, 'html.parser')

driver = webdriver.Firefox()
driver.get(url)

botaoPopUp = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div[1]/div[3]/div/div[2]/div[1]/div[2]/button')))
botaoPopUp.click()

elemento = driver.find_element_by_xpath('/html/body/div[2]/div/div[1]/div[3]/div/div[2]/div/div[2]/div/div/div[1]/div/div[1]/div/div[1]')
elemento.click()

import time 
time.sleep(10)

html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
dados = soup.find('div', class_="Collapsible__contentInner")
print(dados)
  

Результат

 <div class="Collapsible__contentInner"><div style="position: relative;"></div></div>
  

Ответ №1:

Не используйте page_source.

Доступ к элементу напрямую с помощью веб-драйвера:

driver.find_element_by_css_selector(‘.Collapsible__contentInner’)

Затем вы можете получить доступ к содержимому этого элемента с помощью атрибутов, см. доки selenium.

Ответ №2:

Прежде всего, получение всего HTML-источника страницы, а затем удаление нескольких атрибутов элемента — не очень мудрая идея. Тем не менее, если вы хотите получить исходный код HTML страницы, использование page_source не очень надежная идея, поскольку это не гарантирует, что вернет текущее состояние исходного кода HTML страницы. Вместо этого используйте JavaScript outerHTML, как показано ниже:

 html = driver.execute_script("return document.documentElement.outerHTML")