使用 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
提取文本,例如Standard、Cycle Map 等所有 <ul>
使用 and python 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
我正在尝试创建一个 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
提取文本,例如Standard、Cycle Map 等所有 <ul>
使用 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