Итерация по драйверу селена driver.find_elements - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно собрать всю информацию о событии с веб-сайта AXS.com, как часть моего задания по веб-сбору.Я попытался использовать веб-драйвер Chrome с Python + Selenium.

Я могу получить значение, используя driver.find_element_by_class_name() например driver.find_element_by_class_name("headliner").text.

Но при этом получается только первый предмет.Я застрял, пытаясь выполнить итерацию после использования driver.find_elements(By.XPATH,"//div[@class='results-table results-table--events']").

from bs4 import BeautifulSoup
from selenium import webdriver
import time
driver = webdriver.Chrome('/home/.../chromedriver_linux64/chromedriver')
driver.get("https://www.axs.com/browse/music/alternative-punk")
driver.implicitly_wait(10)
allevent_details = driver.find_elements(By.XPATH,"//div[@class='results-table results-table--events']")     
for i in allevent_details:
    print(i.find_element_by_class_name("headliner").text)

Ошибка

NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":"headliner"}
(Session info: chrome=74.0.3729.169)
(Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)

Ожидаемая:

  • Внутренняя волна
  • BLOXX .... и т. Д.

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

Попробуйте любой из следующих локаторов.

Использование Xpath

allevent_details = driver.find_elements(By.XPATH,"//div[@class='results-table results-table--events']")
for i in allevent_details:
     print(i.find_element_by_xpath(".//div[@class='headliner']").text)

Использование Css Selector

for item in driver.find_elements_by_css_selector('.headliner'):
    print(item.text)
0 голосов
/ 05 июня 2019

Чтобы извлечь все заголовки событий со страницы , вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любой из следующих Стратегии локатора :

  • Использование CSS_SELECTOR:

    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.headliner")))])
    
  • Использование XPATH:

    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='headliner']")))])
    
  • Вывод на консоль:

    ['Inner Wave', 'BLOXX, Hembree and Warbly Jets', 'Frenship', 'LANY', 'together PANGEA & Vundabar', 'Night Beats', 'New Politics', 'The Technicolors', 'Davila 666', 'Vansire + BOYO', 'The Starting Line', 'Katzù Oso', 'The Raconteurs', 'Cayucas', 'ALT 98.7 Summer Camp']
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 05 июня 2019

Измените логику, как показано ниже.

from bs4 import BeautifulSoup
from selenium import webdriver
import time
driver = webdriver.Chrome('/home/.../chromedriver_linux64/chromedriver')
driver.get("https://www.axs.com/browse/music/alternative-punk")
driver.implicitly_wait(10)
allevent_details = driver.find_elements(By.XPATH,"//div[@class='results-table results-table--events']//div[@class='headliner']")     
for i in allevent_details:
    print(i.text)
...