You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()  # 爬取完成后关闭浏览器,释放资源

额外提示

  1. 原代码中By.CLASS_NAME的参数包含多余空格("adbl- impression-container "),这会导致元素定位失败,已清理为正确的类名"adbl-impression-container"
  2. 养成爬取结束后调用driver.quit()的习惯,避免浏览器进程残留占用系统资源

内容的提问来源于stack exchange,提问作者cooler gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:17:21