使用Python+Selenium循环爬取Audible时重复获取首个元素的问题
问题原因与解决方案
你的问题出在循环内的XPath表达式上:当你使用//开头的XPath时,Selenium会从整个DOM文档的根节点开始搜索匹配的元素,而不是从当前循环的product节点下查找。所以每次循环都会找到页面上第一个符合条件的元素,导致内容重复20次。
修正步骤
把循环内的XPath开头的//替换为.//(表示从当前节点的后代中查找),或者直接使用相对路径:
修正后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd web = "https://www.audible.in/search" path = "C:/Users/vikas/Downloads/chromedriver-win64/chromedriver-win64/chromedriver" driver = webdriver.Chrome(path) driver.get(web) # 清理CLASS_NAME参数中的多余空格,避免定位失败 container = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "adbl-impression-container"))) products = WebDriverWait(container, 5).until(EC.presence_of_all_elements_located((By.XPATH, "./div/span/ul/li"))) book_title = [] book_author = [] book_length = [] for product in products: # 使用.//限定从当前product节点下查找元素 book_title.append(product.find_element(By.XPATH, './/h3[contains(@class, "bc-heading")]').text) book_author.append(product.find_element(By.XPATH, './/a[contains(@href, "author")]').text) book_length.append(product.find_element(By.XPATH, './/li[contains(@class, "runtimeLabel")]').text) df = pd.DataFrame({'title':book_title, 'author':book_author, 'length':book_length}) df.to_csv('books.csv') driver.quit() # 爬取完成后关闭浏览器,释放资源
额外提示
- 原代码中
By.CLASS_NAME的参数包含多余空格("adbl- impression-container "),这会导致元素定位失败,已清理为正确的类名"adbl-impression-container" - 养成爬取结束后调用
driver.quit()的习惯,避免浏览器进程残留占用系统资源
内容的提问来源于stack exchange,提问作者cooler gamer
相关产品推荐
相关产品推荐

