Получение динамического содержимого HTML на Python3

Я хотел получить часть динамического содержимого html с веб-сайта, я могу видеть это содержимое в «элементе проверки», но не в «исходном коде». Я безуспешно пытался использовать библиотеки BeautifulSoup и selenium, так как после загрузки страницы мне нужно было нажать несколько экранных кнопок, чтобы загрузить контент.

Например, на веб-сайте http://play.typeracer.com я могу загрузить его исходный html-код, но не могу загрузить контент, который появляется после нажатия кнопки «Практика» на веб-странице. (таблицы и текст)

Надеюсь, я был откровенен, спасибо за внимание

Ознакомьтесь с пакетом requests-html. Он позволяет визуализировать страницу перед извлечением данных.

RandomDude 29.07.2018 15:09

При использовании webdriver Selenium я смог открыть firefox и нажать клавишу с помощью «driver = webdriver.Firefox ()» и «driver.get (« website.com ") ». Но если я загружаю контент после нажатия любой клавиши, он дает мне ошибка и вылетает программа. Я проверю.

Miguel 29.07.2018 15:15

Мне непонятно, чего вы на самом деле пытаетесь достичь. Вы хотите очистить контент или автоматизировать / смоделировать пользователя веб-сайта? Приведите, пожалуйста, полный пример - иначе я не смогу вам помочь

RandomDude 29.07.2018 15:55

Я хочу очистить контент, например получить текст, который вы должны записать в файл .txt.

Miguel 29.07.2018 16:05

Под текстом, который вы должны написать, я имею в виду предложения, которые являются частью игры Typeracer, например, те, которые появляются, когда вы нажимаете "практика".

Miguel 29.07.2018 16:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение с использованием Selenium и Firefox:

  1. Откройте окно браузера и перейдите по URL-адресу
  2. Жду, пока не появится ссылка на практику
  3. Извлечение всех элементов диапазона, которые содержат часть текста
  4. Создайте строку вывода. Если в первом слове только одна буква, будет только 2 элемента span. Если слово состоит из более чем одной буквы, будет 3 элемента span.
    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? не должен ли он ждать автоматически и, таким образом, не требовать, наконец, попытки?

    Miguel 29.07.2018 17:50
    // является частью синтаксис xpath. WebDriverWait ждет в нашем случае до 30 секунд, пока элемент не будет найден. try finally гарантирует, что код в finally выполняется только в том случае, если код в try выполняется без исключения.
    RandomDude 29.07.2018 18:03

    Мой код не должен быть идеальным - просто быстрое и грязное решение, которое должно дать вам достаточно, чтобы понять, как он работает;)

    RandomDude 29.07.2018 18:15

    Да, это помогло понять веб-драйвер. Спасибо!

    Miguel 29.07.2018 18:29

    Другие вопросы по теме