解决Selenium爬虫中商品名称与缺失销量的匹配错位问题
解决Selenium爬取商品时销量缺失导致的匹配错位问题
你遇到的问题本质是两个列表长度不一致时,zip()会按最短的列表完成配对,导致没有销量的商品位置被跳过,后续的名称和销量完全错位。要解决这个问题,我们应该换个思路:先定位每个商品的独立容器,再从每个容器内单独提取名称和销量,这样就能保证每个商品的信息一一对应,缺失销量的直接填充"0"。
具体解决方案代码
首先需要导入NoSuchElementException来捕获元素不存在的情况,然后修改代码逻辑:
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException # 导入异常类 # 初始化浏览器驱动(根据你的浏览器类型调整,比如Chrome/Firefox) browserdriver = webdriver.Chrome() # 每个商品的容器xpath,需根据页面实际结构确认(可通过浏览器开发者工具查看) element_product = "//div[contains(@class, 'product-item')]" link='https://www.sendo.vn/shop/dungcuykhoa_tanphu/san-pham/?p=1' browserdriver.get(link) # 获取所有商品的独立容器 all_products = browserdriver.find_elements_by_xpath(element_product) for product in all_products: # 从当前商品容器内提取名称(使用相对路径.//) name = product.find_element_by_xpath(".//*[@class='name_product shop_color_hover']").text # 提取销量,不存在则填充"0" try: sold = product.find_element_by_xpath(".//*[@class='s_b']").text except NoSuchElementException: sold = "0" print(f"{name}:::{sold}") print("program end") browserdriver.quit() # 记得关闭浏览器释放资源
关键说明
- 定位商品容器:
element_product的xpath需要你根据页面实际HTML结构确认,比如在目标页面中,每个商品大概率包裹在class包含product-item的div里(可通过浏览器F12开发者工具查看元素结构)。找到这个共同父容器是核心,这样我们就能在每个容器内独立查询子元素。 - 相对路径查询:使用
.//开头的xpath,表示从当前商品容器内部开始查找元素,而不是从整个文档根节点查找,彻底避免全局查找导致的元素混乱。 - 异常捕获:用
try-except捕获NoSuchElementException,当某个商品没有销量元素时,直接将销量设置为"0",完美解决缺失值问题。
这样修改后,每个商品的名称和销量都会精准对应,再也不会出现错位的情况了。
内容的提问来源于stack exchange,提问作者Huynh
相关产品推荐
相关产品推荐

