我在這里的 Python selenium 代碼將我們帶到一個頁面,其中包含我有興趣抓取的一些資料集。這是我的代碼。
import time, os
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
options = webdriver.ChromeOptions()
preferences= {"download.default_directory": os.getcwd(), "directory_upgrade": True}
options.add_experimental_option("prefs", preferences)
#options.headless = True
options.add_experimental_option('excludeSwitches', ['enable-logging'])
url = "http://www.ssp.sp.gov.br/transparenciassp/"
# Path of my WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
wait = WebDriverWait(driver, 10)
# to maximize the browser window
driver.maximize_window()
#get method to launch the URL
driver.get(url)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#cphBody_btnHomicicio"))).click()
for x in range(18, 19):
year = '#cphBody_lkAno' str(x)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year))).click()
for x in range(1, 2):
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#cphBody_lkMes' str(x)))).click()
到目前為止,這是可行的,但是我的問題來自此語法的最后一個回圈,即使它完全符合我的要求。我想要做的是使用包含文本“cphBody_lkMes”的 CSS 選擇器選擇頁面上的所有元素,并將它們放在類似的串列中
['#cphBody_lkMes1','#cphBody_lkMes2', ...]
這樣我就可以相應地遍歷它們。當前的代碼看起來很亂。
當我嘗試
for x in range(18, 19):
year = '#cphBody_lkAno' str(x)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year))).click()
meses = driver.find_elements_by_css_selector("//*[contains(text(),'cphBody_lkMes')]")
meses
for x in range(1, 2):
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#cphBody_lkMes' str(x)))).click()
串列顯示為空,錯誤提示
An invalid or illegal selector was specified.
我該如何解決這個問題?
uj5u.com熱心網友回復:
id要使用屬性以您開頭的 CSS 選擇器選擇頁面上的所有元素,cphBody_lkMes您需要為visibility_of_all_elements_located()引入WebDriverWait,您可以使用以下任一定位器策略:
使用CSS_SELECTOR
print([my_elem.get_attribute("id") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "ul.nav.nav-pills.mesNav li > a[id^='cphBody_lkMes']")))])使用XPATH:
print([my_elem.get_attribute("id") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//ul[@class='nav nav-pills mesNav']//li/a[starts-with(@id, 'cphBody_lkMes')]")))])
更新
迭代串列:
months = [my_elem.get_attribute("id") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "ul.nav.nav-pills.mesNav li > a[id^='cphBody_lkMes']")))]
for month in months:
print(month)
uj5u.com熱心網友回復:
我在這里看到幾個問題:
- 您
x在外部和內部for回圈中定義索引 - 它應該在
meses = driver.find_elements_by_xpath那里而不是meses = driver.find_elements_by_css_selector - 最后
cphBody_lkMes是元素id值的子字串,而不是text值。
所以,這給了我非空meses串列:
for x in range(18, 19):
year = '#cphBody_lkAno' str(x)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, year))).click()
meses = driver.find_elements_by_xpath("//*[contains(@id,'cphBody_lkMes')]")
for y in range(1, 2):
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#cphBody_lkMes' str(y)))).click()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/450450.html
標籤:Python 列表 硒 硒网络驱动程序 css 选择器
