Я хотел получить часть динамического содержимого html с веб-сайта, я могу видеть это содержимое в «элементе проверки», но не в «исходном коде». Я безуспешно пытался использовать библиотеки BeautifulSoup и selenium, так как после загрузки страницы мне нужно было нажать несколько экранных кнопок, чтобы загрузить контент.
Например, на веб-сайте http://play.typeracer.com я могу загрузить его исходный html-код, но не могу загрузить контент, который появляется после нажатия кнопки «Практика» на веб-странице. (таблицы и текст)
Надеюсь, я был откровенен, спасибо за внимание
При использовании webdriver Selenium я смог открыть firefox и нажать клавишу с помощью «driver = webdriver.Firefox ()» и «driver.get (« website.com ") ». Но если я загружаю контент после нажатия любой клавиши, он дает мне ошибка и вылетает программа. Я проверю.
Мне непонятно, чего вы на самом деле пытаетесь достичь. Вы хотите очистить контент или автоматизировать / смоделировать пользователя веб-сайта? Приведите, пожалуйста, полный пример - иначе я не смогу вам помочь
Я хочу очистить контент, например получить текст, который вы должны записать в файл .txt.
Под текстом, который вы должны написать, я имею в виду предложения, которые являются частью игры Typeracer, например, те, которые появляются, когда вы нажимаете "практика".






Вот решение с использованием Selenium и Firefox:
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 = 'http://play.typeracer.com/'
browser = webdriver.Firefox()
browser.get(url)
try: # waiting till link is loaded
element = WebDriverWait(browser, 30).until(
EC.presence_of_element_located((By.LINK_TEXT, 'Practice')))
finally: # link loaded -> click it
element.click()
try: # wait till text is loaded
WebDriverWait(browser, 30).until(
EC.presence_of_element_located((By.XPATH, '//span[@unselectable = "on"]')))
finally: # extract text
spans = browser.find_elements_by_xpath('//span[@unselectable = "on"]')
if len(spans) == 2: # first word has only one letter
text = f'{spans[0].text} {spans[1].text}'
elif len(spans) == 3: # first word has more than one letter
text = f'{spans[0].text}{spans[1].text} {spans[2].text}'
else:
text = ' '.join([span.text for span in spans])
print('special case that is not handled yet: {text}')
print(text)
>>> 'Scissors cuts paper. Paper covers rock. Rock crushes lizard. Lizard poisons Spock. Spock smashes scissors. Scissors decapitates lizard. Lizard eats paper. Paper disproves Spock. Spock vaporizes rock. And as it always has, rock crushes scissors.'
Обновлять
На всякий случай, если вы захотите потом автоматизировать набор текста;)
try:
txt_input = WebDriverWait(browser, 30).until(
EC.presence_of_element_located((By.XPATH,
'//input[@class = "txtInput" and @autocorrect = "off"]')))
finally:
for letter in text:
txt_input.send_keys(letter)
Причина появления блоков try:... finally: ... в том, что нам нужно ждать, пока контент загрузится, что иногда может занять довольно много времени.
Спасибо, отличный ответ! Не могли бы вы просто объяснить, почему для поиска по элементу требуется "//" в начале, а также что именно делает WebDriverWait? не должен ли он ждать автоматически и, таким образом, не требовать, наконец, попытки?
// является частью синтаксис xpath. WebDriverWait ждет в нашем случае до 30 секунд, пока элемент не будет найден. try finally гарантирует, что код в finally выполняется только в том случае, если код в try выполняется без исключения.
Мой код не должен быть идеальным - просто быстрое и грязное решение, которое должно дать вам достаточно, чтобы понять, как он работает;)
Да, это помогло понять веб-драйвер. Спасибо!
Ознакомьтесь с пакетом
requests-html. Он позволяет визуализировать страницу перед извлечением данных.