使用Python Selenium提取同类名网页元素信息的问题求助
问题修正方案
原代码核心错误点
- 路径范围错误:XPath以
//开头时会全局匹配整个文档的元素,而非限定在当前遍历的li节点下,导致每次循环都重复获取全页面所有符合条件的元素,最终输出内容全部重复。需改用.//开头的相对路径,限定查找范围为当前li内部。 - 逻辑适配错误:每个
li节点仅对应一组「属性名+属性值」,而非每个li都包含4个目标字段的内容,无需嵌套循环遍历span,只需逐行判断属性名,将对应属性值存入对应列表即可。 - 方法调用错误:
find_elements返回的是元素列表,无法直接调用.text属性,需改用单数形式find_element获取单个元素后再提取文本。
修正后可运行代码
from selenium import webdriver import pandas as pd from selenium.webdriver.common.by import By # 启动Chrome浏览器(Selenium3可保留原有路径写法,Selenium4建议用Service封装路径) browser = webdriver.Chrome(r'C:\Users\KristerJens\Downloads\chromedriver_win32\chromedriver') # 添加隐式等待,避免元素未加载完成导致的报错 browser.implicitly_wait(10) # 访问目标页面 browser.get("https://www.xl-byg.dk/shop/knauf-insulation-ecobatt-murfilt-190-mm-2255993") # 初始化四个字段的存储列表 brand = [] product = [] series = [] model = [] # 遍历ul下的所有li属性行 for li in browser.find_elements(By.XPATH, "//ul[@class='short ng-star-inserted']/li"): # 提取当前li内的属性名和属性值,限定在li内部查找 attr_name = li.find_element(By.XPATH, ".//span[@class='attribute-name']").text.strip() attr_value = li.find_element(By.XPATH, ".//span[@class='attribute-value']").text.strip() # 根据属性名匹配对应列表存入值 if attr_name == 'Mærke': brand.append(attr_value) elif attr_name == 'Produkttype': product.append(attr_value) elif attr_name == 'Serie': series.append(attr_value) elif attr_name == 'Model': model.append(attr_value) # 生成目标DataFrame df = pd.DataFrame({ 'Mærke': brand, 'Produkttype': product, 'Serie': series, 'Model': model }) print(df) # 操作完成后关闭浏览器释放资源 browser.quit()
如果你使用的是Selenium3.x版本,将代码中find_elements(By.XPATH, xxx)替换为find_elements_by_xpath(xxx)、find_element(By.XPATH, xxx)替换为find_element_by_xpath(xxx)即可正常运行。
内容的提问来源于stack exchange,提问作者awi1100
相关产品推荐
相关产品推荐

