Python/Selenium中zip()函数返回结果不符合预期的问题排查
问题分析与解决方案:Selenium遍历商品时信息匹配错误
Hey there, let's break down what's going wrong with your script and fix it step by step.
核心问题所在
- 全局列表遍历逻辑错误:你提前获取了全站的
shirts和colors列表,在找到第一个有货商品时,用zip(shirts, colors)循环了所有商品的信息——这就是为什么你看到最后一个商品的内容被输出,因为这个循环会跑完所有条目,最后留下的是最后一条的结果。你应该在当前遍历的article内部获取对应商品的信息,而非依赖全局列表。 - 库存判断逻辑不稳定:用
article.find_element_by_tag_name('a').text == ""判断有货太脆弱,页面元素的文本可能因加载延迟、布局差异出现偏差。更可靠的方式是检查是否存在"sold out"元素——不存在则代表商品有货。 - 链接定位不准确:你用
article.find_element_by_xpath('div/a')获取链接,这个路径可能指向颜色标签或其他无关的a标签,需要精准定位到商品标题的链接。
修正后的代码
from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.action_chains import ActionChains articles = driver.find_elements_by_tag_name('article') for article in articles: # 移动到元素确保所有子元素加载完成 ActionChains(driver).move_to_element(article).perform() try: # 尝试查找"sold out"标签,找到则判定为售罄 article.find_element_by_xpath(".//a[text()='sold out']") print("sold out") except NoSuchElementException: # 未找到售罄标签,判定为有货 print("available") # 在当前article内精准获取商品信息 shirt_name = article.find_element_by_xpath(".//div/h1/a").text color_name = article.find_element_by_xpath(".//div/p/a").text product_link = article.find_element_by_xpath(".//div/h1/a").get_attribute('href') print(f"{shirt_name} {color_name}") print(product_link)
关键修正说明
- 移除全局商品列表:现在每个
article只处理自身内部的元素,确保商品信息与当前条目一一对应。 - 异常捕获判断库存:用
try-except捕获NoSuchElementException来判断库存状态,比文本匹配更稳定,只要页面上没有"sold out"元素,就代表商品可购买。 - 相对路径定位元素:所有xpath都以
.开头,代表仅在当前article元素内部查找,避免定位到页面其他区域的元素。 - 直接输出当前商品信息:不再循环全局列表,只输出当前有货商品的名称、颜色和链接,完全符合你的预期。
内容的提问来源于stack exchange,提问作者cyber1337
相关产品推荐
相关产品推荐

