Получить все элементы H2 со страницы с помощью Selenium

Следуя моим предыдущим двум вопросам: есть ли в Selenium что-то вроде Find All от BeautifulSoup?

Мне нужно получить все содержимое тегов H2 на странице, например эта.

Отличный код, который JeffC привел в предыдущих вопросах, получает содержимое одного конкретного тега для каждой страницы. Но здесь у меня до 20 подобных тегов на каждую страницу.

Кроме того, мне нужно получить текст H2 и HREF.

Текущее состояние:

driver = webdriver.Chrome(options=options)
driver.maximize_window()
wait = WebDriverWait(driver, 10)

url = 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985?b_start:int=0'
driver.get(url)
h2 = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "tileHeadline"))).text
print(h2)

Пока что код выводит только первый элемент на каждой странице. Должен ли я изменить спецификации внутри элемента EC?

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот скрипт получает элементы h2 a, href и текст, а затем печатает их:

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

options = webdriver.ChromeOptions()
options.add_argument("--disable-notifications")
options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
try:
    driver.get("http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985?b_start:int=0")
    wait.until(EC.visibility_of_element_located(("css selector", ".tileHeadline")))
    elements = driver.find_elements("css selector", "h2 a")
    for element in elements:
        print()
        print(element.get_attribute("href"))
        print(element.text)
finally:
    driver.quit()

Первые несколько строк вывода:

http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985/01.pdf/view
15 de março de 1985 - Pronunciamento do Presidente José Sarney, no exercício da Presidência da República, ao empossar o ministério

http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985/02.pdf/view
17 de março de 1985 - Pronunciamento da Presidente José Sarney, no exercício da Presidência da república, por ocasião da abertura da primeira reunião do ministério da nova República

http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985/28%20de%20marco%20de%201985/view
28 de março de 1985 - Pronunciamento do Presidente José Sarney, no exercício da Presidência da República, ao receber a bancada do PMDB no Rio de Janeiro
Ответ принят как подходящий

Я знаю, что вы уже приняли ответ, но на самом деле он не объяснил, в чем заключалась проблема. Основная проблема в том, что

single_element = wait.until(EC.visibility_of_element_located())
                                                   ^ singular element

возвращает один элемент. Существует версия во множественном числе, которая возвращает коллекцию элементов,

element_collection = wait.until(EC.visibility_of_all_elements_located())
                                                            ^ plural elementS

Используя эту информацию, мы можем обновить ваш текущий код,

driver = webdriver.Chrome(options=options)
driver.maximize_window()
wait = WebDriverWait(driver, 10)

url = 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985?b_start:int=0'
driver.get(url)
links = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "h2 a")))
for link in links:
    print(link.text)
    print(link.get_attribute("href"))

который выводит

15 de março de 1985 - Pronunciamento do Presidente José Sarney, no exercício da Presidência da República, ao empossar o ministério
http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985/01.pdf/view
17 de março de 1985 - Pronunciamento da Presidente José Sarney, no exercício da Presidência da república, por ocasião da abertura da primeira reunião do ministério da nova República
http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/jose-sarney/discursos/1985/02.pdf/view
...

Кроме того, пожалуйста, не используйте локаторы, такие как

.find_elements("css selector", "h2 a")

где «селектор CSS» и т. д. — это строка. Да, он будет работать, но он подвержен опечаткам, и ваша IDE не узнает об опечатках до тех пор, пока вы не запустите сценарий и не произойдет сбой. Вместо этого используйте By.CSS_SELECTOR, как показано ниже.

.find_elements(By.CSS_SELECTOR, "h2 a")

Ваша IDE поможет вам автоматически заполнить его, и если есть опечатки, IDE пометит их как ошибки, прежде чем вы запустите ее, сэкономив ваше время.

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