Следуя моим предыдущим двум вопросам: есть ли в 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?
Этот скрипт получает элементы 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 пометит их как ошибки, прежде чем вы запустите ее, сэкономив ваше время.