Как извлечь текст из div в Selenium с помощью Python, когда новые div добавляются примерно каждые 1 секунду?

Я пытаюсь извлечь содержимое из divs на веб-странице с помощью Selenium. Веб-страница создается динамически, и каждую секунду или около того в HTML-код на веб-странице вставляется новый элемент div.

Пока у меня есть следующий код:

from selenium import webdriver

chrome_path = r"C:\scrape\chromedriver.exe"

driver = webdriver.Chrome(chrome_path)

driver.get("https://website.com/")

messages = []
for message in driver.find_elements_by_class_name('div_i_am_targeting'):
    messages.append(message.text)

for x in messages:
    print(x)

Что отлично работает, проблема в том, что он печатает значения divs на странице только во время его запуска, я хочу постоянно извлекать текст из the_div_i_am_targeting, и каждую секунду на странице появляются новые divs.

Я нашел это: Обработка динамических div в селене. Это был самый близкий связанный вопрос, который я мог найти , но это не соответствует моему вопросу и ответов нет.

Как я могу обновить приведенный выше код, чтобы он постоянно печатал содержимое div на странице для выбранного мной div (в этом примере div_i_am_targeting), включая новые div, которые добавляются на страницу после выполнения программы?


person Gary    schedule 24.11.2018    source источник
comment
Я думаю, вам нужно поместить это в бесконечный цикл, но имеет ли каждый div какую-либо уникальную идентификацию, поскольку нам нужно исключить уже обработанные div?   -  person Samarth    schedule 24.11.2018
comment
@ Гэри, можешь поделиться веб-страницей, которую пытаешься очистить? Я не могу протестировать здесь без конкретной ссылки, чтобы убедиться, что мое решение работает.   -  person Luan Naufal    schedule 24.11.2018
comment
Одним из решений было бы добавить цикл со сном в конце, чтобы вы могли убедиться, что берете все сгенерированные div: if message.text not in messages: messages.append(message.text) sleep(1)   -  person Luan Naufal    schedule 24.11.2018
comment
Спасибо обоим. Я не могу поделиться веб-страницей, но контент, который я хочу извлечь, находится в the_div_i_am_targeting, в этих div нет уникального идентификатора, структура контента: div class=the_div_i_am_targeting› ‹p › некоторый текст ‹/p›‹/div› этот шаблон бесконечно повторяется на странице, поэтому создается много одинаковых блоков div. Приведенный выше код работает нормально, но мне нужно найти способ заставить программу продолжать работать и непрерывно захватывать новые элементы div по мере их создания. Спасибо за предложение о повторении цикла с помощью message.text, а не в сообщениях.   -  person Gary    schedule 24.11.2018
comment
@ Гэри Я понимаю, что ваш usecase состоит в том, чтобы извлечь текст из недавно добавленных <div>, но каковы критерии выхода для вашего теста?   -  person DebanjanB    schedule 24.11.2018
comment
@DebanjanB Я просто хочу, чтобы это работало постоянно, поскольку страница постоянно обновляется 24/7; но если требуется условие выхода, возможно, оно может быть, если в течение 5 минут не было новых div.   -  person Gary    schedule 24.11.2018


Ответы (1)


Вы можете применить приведенный ниже код для непрерывной печати содержимого необходимых разделов:

from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium import webdriver

chrome_path = r"C:\scrape\chromedriver.exe"

driver = webdriver.Chrome(chrome_path)
driver.get("https://website.com/")
# Get current divs
messages = driver.find_elements_by_class_name('div_i_am_targeting')
# Print all messages
for message in messages:
    print(message.text)

while True:
    try:
        # Wait up to minute for new message to appear
        wait(driver, 60).until(lambda driver: driver.find_elements_by_class_name('div_i_am_targeting') != messages)
        # Print new message
        for message in [m.text for m in driver.find_elements_by_class_name('div_i_am_targeting') if m not in messages]:
            print(message)
        # Update list of messages
        messages = driver.find_elements_by_class_name('div_i_am_targeting')
    except:
        # Break the loop in case no new messages after minute passed
        print('No new messages')
        break
person Andersson    schedule 24.11.2018
comment
Андерссон, спасибо за это отличное решение. Кажется, это полуработает для меня. Но я заметил, что после добавления переменного количества дополнительных элементов div (около 10, но не всегда 10) он иногда пропускает новый div, затем продолжает, и всегда будет сбой после добавления 20 новых div. Я проверил html и не вижу ничего другого в структуре div для тех div, на которые он ломается. Можете ли вы придумать какую-либо причину, почему это может быть? Спасибо - person Gary; 24.11.2018
comment
Чтобы облегчить отладку, я добавил print(count) после #print new message, comment. Я заметил, что он постоянно останавливается на от 48 до 49 общего количества div (даже несмотря на то, что новые div добавляются в течение нескольких секунд после печати последнего div), и хотя он пропускает некоторые div, в распечатке он все еще может видеть они есть, потому что счетчик над оператором печати нового сообщения прыгает, например, он будет работать: 35... печатный вывод, 36.... печатный вывод.... 39.... печатный вывод - person Gary; 24.11.2018
comment
@Gary, старые div все еще на странице? Или они удаляются после добавления некоторого количества новых div? Также возможно ли, что несколько новых сообщений приходят одновременно или время между сообщениями почти постоянное? - person Andersson; 24.11.2018
comment
Отличный момент, да, я проверил, и после определенного количества div старые div заменяются таким образом, что первый div удаляется каждый раз, когда добавляется новый div (визуальное отображение представляет собой поле в виде списка, которое показывает только последние x сообщений и каждый div содержит одно сообщение); да, сообщения происходят постоянно, некоторые могут приходить каждую секунду, некоторые могут быть очень близки к одному и тому же времени и ближе по времени, чем 1 секунда - person Gary; 24.11.2018
comment
@Gary, попробуйте обновленный ответ и дайте мне знать, если возникнут новые проблемы. - person Andersson; 24.11.2018
comment
Удивительно, как вы точно определили проблему и с новой информацией так быстро нашли решение. Еще раз спасибо, это отлично работает. - person Gary; 24.11.2018