如何使用Python Selenium实现Flipkart平台商品按人气排序
问题原因
你现有代码存在两个核心错误:
- 定位表达式与实际HTML结构不匹配:你提供的排序选项为
span标签,但你的XPATH规则写的是匹配div标签,自然无法命中元素 - 定位语法错误:
presence_of_element_located方法需要接收(定位方式, 定位表达式)格式的元组,你错误写成了By.XPATH(表达式)的函数调用形式,属于基础语法错误
另外补充两个稳定性优化点:
- 优先使用
element_to_be_clickable替代presence_of_element_located,避免元素已存在但还未渲染完成无法点击的问题 - 用
normalize-space()处理文本前后可能存在的空白字符,避免因为文本带隐含空格导致匹配失败 - Windows文件路径建议加
r标记为原始字符串,避免反斜杠转义导致路径识别错误
修正后的可运行代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time product = input("Which product review you want: ").lower() print(f"Best {product} in your range from famous website") # 加r标记为原始字符串,避免路径转义问题 PATH = r"C:\Program Files (x86)\chromedriver.exe" driver = webdriver.Chrome(PATH) try: driver.get("https://www.flipkart.com/") search = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME,"q")) ) search.send_keys(product) search.send_keys(Keys.ENTER) # 修正XPATH和定位语法,使用element_to_be_clickable提升稳定性 pop = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//span[normalize-space(text())='Popularity']")) ) pop.click() print(driver.current_url) time.sleep(2) finally: time.sleep(2) driver.quit()
如果运行后仍然无法点击,可以尝试在点击前加1秒强制等待,或者用JS执行点击的方式替代原生click,避免元素被遮挡的问题:
# 替换pop.click()为下面的代码 driver.execute_script("arguments[0].click();", pop)
内容的提问来源于stack exchange,提问作者Sarthak Hingankar
相关产品推荐
相关产品推荐

