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

Я пытаюсь извлечь контент из divs на веб-странице с помощью Selenium. Веб-страница генерируется динамически, и каждую секунду или около того в веб-страницу вставляется новый 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, которые добавляются на страницу после выполнения программы?

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
Другие вопросы по тегам