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
相关产品推荐
相关产品推荐

