如何解决使用Selenium提取无序列表中的所有列表项
我正在尝试创建一个Selenium Python脚本,该脚本根据用户(即“ Moscow”)的输入在地图网站(具体来说为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
要提取文本,例如使用Selenium和python来自所有<ul>
的 Standard , Cycle Map 等,您必须得出WebDriverWait visibility_of_all_elements_located()
,则可以使用以下任一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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。