Selenium脚本仅返回单个元素,如何获取前3个目标电价信息?
问题描述
我是Python新手,正在做一个网页抓取项目,目标网址:https://www.elpriskollen.se/sv/Avtalssida/?ellevid=236&postnummer=18164&forbrukning=20000&avtalId=31792&prevContractTypeId=20。我想采集页面蓝白框中前3条信息的电价(如536,25 öre/kWh)和供应商名称(如Cheap Energy AB),但当前脚本仅返回第一条结果。尝试使用相对路径.//时出现元素定位失败的错误,错误信息如下:
Message: no such element: Unable to locate element: {"method":"xpath","selector":".//*[@id="main"]/div[3]/div[3]/div[2]/ul/li[1]/div[2]/div/div[1]/div/div/div"}
我的代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC s = Service("/Users/brustabl1/lpthw/chromedriver") url = "https://www.elpriskollen.se/sv/Avtalssida/?ellevid=236&postnummer=18164&forbrukning=20000&avtalId=31792&prevContractTypeId=20" driver = webdriver.Chrome(service=s) driver.maximize_window() driver.implicitly_wait(10) driver.get(url) # 选择"个人"选项 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="cookie-customer-type"]/div/div/div/div[3]/nav/ul/li[1]'))).click() lists = driver.find_elements(By.XPATH, '//*[@id="main"]/div[3]/div[3]/div[2]/ul/li[1]/div[2]/div') for list in lists: price = list.find_element(By.XPATH,'//*[@id="main"]/div[3]/div[3]/div[2]/ul/li[1]/div[2]/div/div[1]/div/div/div') name = list.find_element(By.XPATH, '//*[@id="main"]/div[3]/div[3]/div[2]/ul/li[1]/div[2]/div/div[2]/div/div/div/p[1]') print(price.text, name.text)
解决方案
你的代码有两个核心问题:
- 列表元素定位错误:原代码中
lists的XPATH指定了li[1],只抓取了第一条条目,所以循环只能输出一个结果。 - 子元素定位路径错误:循环内使用绝对XPATH会每次都定位到第一条的元素;而你尝试的相对路径错误地保留了完整绝对路径,没有基于当前条目元素进行定位。
修正后的代码如下:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC s = Service("/Users/brustabl1/lpthw/chromedriver") url = "https://www.elpriskollen.se/sv/Avtalssida/?ellevid=236&postnummer=18164&forbrukning=20000&avtalId=31792&prevContractTypeId=20" driver = webdriver.Chrome(service=s) driver.maximize_window() driver.implicitly_wait(10) driver.get(url) # 选择"个人"选项 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="cookie-customer-type"]/div/div/div/div[3]/nav/ul/li[1]'))).click() # 定位所有蓝白框条目(去掉li[1],抓取全部条目) items = driver.find_elements(By.XPATH, '//*[@id="main"]/div[3]/div[3]/div[2]/ul/li') # 只取前3条 for item in items[:3]: # 使用相对路径定位当前条目下的电价和供应商名称 price = item.find_element(By.XPATH, './/div[2]/div/div[1]/div/div/div') name = item.find_element(By.XPATH, './/div[2]/div/div[2]/div/div/div/p[1]') print(f"供应商:{name.text},电价:{price.text}") driver.quit()
关键改动说明:
- 将
lists改为items,XPATH调整为//*[@id="main"]/div[3]/div[3]/div[2]/ul/li,获取所有条目元素。 - 循环时用
items[:3]切片,只处理前3条数据。 - 子元素定位使用
.//开头的相对路径,基于当前item(每个li元素)向下查找,避免重复定位第一条。
内容的提问来源于stack exchange,提问作者brustabl1
相关产品推荐
相关产品推荐

