You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
解决方案

你的代码有两个核心问题:

  1. 列表元素定位错误:原代码中lists的XPATH指定了li[1],只抓取了第一条条目,所以循环只能输出一个结果。
  2. 子元素定位路径错误:循环内使用绝对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:45:41