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

Python使用BeautifulSoup爬取亚马逊图书时如何更简洁地将数据存入字典

优化实现方案

完全可以跳过双循环+临时列表的步骤,直接单次遍历匹配键值节点写入字典,不仅代码更简洁,还能避免键值列表长度不匹配导致的数据错位问题。

原实现逻辑参考(常见的现有版本)

一般你当前在用的代码结构大概是这样:

from bs4 import BeautifulSoup
import requests

# 省略页面请求、Selenium获取页面源码的步骤
soup = BeautifulSoup(page_source, "lxml")

keys = []
values = []
# 第一次循环提取属性键
for key_node in soup.select("th.prodDetSectionEntry"):
    keys.append(key_node.get_text(strip=True))
# 第二次循环提取属性值
for value_node in soup.select("td.prodDetAttrValue"):
    values.append(value_node.get_text(strip=True))
# 合并为字典
book_info = dict(zip(keys, values))

优化后写法(BeautifulSoup场景)

直接遍历包含键值对的父节点,单次循环同时提取键和值,用字典推导式实现:

# 选择所有包含图书属性的行节点,选择器可根据亚马逊页面实际结构调整
book_info = {
    row.select_one("th").get_text(strip=True): row.select_one("td").get_text(strip=True)
    for row in soup.select("#productDetails_detailBullets_sections1 tr")
    # 过滤掉无有效键值的空行/异常行
    if row.select_one("th") and row.select_one("td")
}

注:上述代码中的CSS选择器可根据亚马逊当前页面的实际结构调整,核心遍历逻辑通用

优化后写法(Selenium直接操作元素场景)

如果不用BeautifulSoup,直接用Selenium提取也可以用同样逻辑:

from selenium.webdriver.common.by import By

rows = driver.find_elements(By.CSS_SELECTOR, "#productDetails_detailBullets_sections1 tr")
book_info = {}
for row in rows:
    try:
        key = row.find_element(By.TAG_NAME, "th").text.strip()
        value = row.find_element(By.TAG_NAME, "td").text.strip()
        book_info[key] = value
    except:
        # 跳过结构异常的行
        continue

优化优势

  • 只需要遍历一次节点,比双循环减少了一半的遍历开销
  • 不需要维护两个临时列表,内存占用更低
  • 自带异常行过滤逻辑,不会出现键值列表长度不一致导致zip时数据错位的问题

内容的提问来源于stack exchange,提问作者3cx03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:18:02