使用 Selenium 提取无序列表中的所有列表项

Use Selenium to extract all list items in an Unordered list

我正在尝试创建一个 Selenium Python 脚本,该脚本根据用户的输入(即“莫斯科”)在地图网站(openstreetmap.org 上找到具体位置),然后从水平下拉菜单中为地图选择一个特定的图形图层,同样基于用户输入。

我的脚本进入网站,打开下拉菜单,找到包含图层选项的元素,这是一个无序列表。

但是,我发现 5 层选项中只有 2 层被提取。更重要的是,第一个提取的列表项是网站上的第三个选项,第二个是第一个选项。

这是我的代码。 输入 openstreetmap.org:

base_url = 'https://www.openstreetmap.org/search?query=' + place_name
browser = webdriver.Firefox()
browser.get(base_url)
browser.implicitly_wait(3)

打开水平下拉菜单:

link_to_buttons = browser.find_elements_by_css_selector('a.control-button')
link_to_buttons[3].click()

提取无序列表:

link_to_options = browser.find_elements_by_css_selector('ul.list-unstyled')

您需要更改定位器。

ul.list-unstyled 找到整个图层列表(ul 元素),但您需要此列表中的选项(li 元素)。

让我们试试这个定位器:.base-layers li

提取文本,例如StandardCycle Map 等所有 <ul> 使用 and you have to induce for visibility_of_all_elements_located() and you can use either of the following :

  • 使用CSS_SELECTOR:

    driver.get('https://www.openstreetmap.org/search?query=Moscow#map=10/55.7252/37.6290')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='control-button' and @data-original-title='Layers']/span"))).click()
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.section.base-layers>ul.list-unstyled li label")))])
    
  • 使用XPATH:

    driver.get('https://www.openstreetmap.org/search?query=Moscow#map=10/55.7252/37.6290')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.control-button[data-original-title='Layers']>span"))).click()
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='section base-layers']/ul[@class='list-unstyled']//li//label")))])
    
  • 控制台输出:

    ['Standard', 'Cycle Map', 'Transport Map', 'ÖPNVKarte', 'Humanitarian']
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC