【问题标题】:Use Selenium to extract all list items in an Unordered list使用 Selenium 提取无序列表中的所有列表项
【发布时间】:2020-09-22 05:01:15
【问题描述】:

我正在尝试创建一个 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')

【问题讨论】:

  • 您的问题是什么,您想要的输出是什么?

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

提取文本,例如标准循环地图等来自所有<ul>,使用Selenium,你必须为visibility_of_all_elements_located()诱导WebDriverWait,你可以使用以下任一Locator Strategies:

  • 使用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
    

【讨论】:

    【解决方案2】:

    您需要更改定位器。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多