Python存储爬取内容到字典报TypeError: str对象不支持项赋值
报错根因
TypeError: 'str' object does not support item assignment触发的直接原因是变量类型被意外覆盖:初始定义content = {}为字典类型,但h2、h3标签遍历循环中,content = y.findNext('p').get_text()、content = q.findNext('p').get_text()两行代码直接将content变量重写为字符串类型,后续使用content["键名"]的字典键值对赋值语法时,字符串类型不支持该操作就会抛出报错。
原代码还存在逻辑缺陷:循环中反复给content赋值p标签文本,最终只会保留最后一个匹配到的p标签内容,之前爬取的段落文本会被全部覆盖丢失;同时裸except会吞掉所有报错,且没有对findNext的返回值做非空判断,遇到标题后无对应p标签的场景会触发属性错误。
修复方案
- 保留
content的字典类型,不要直接用爬取到的字符串覆盖整个变量,将提取到的标题、段落文本按字段存入字典对应键中 - 单次提取DOM节点的文本内容后复用变量,减少重复的DOM查询操作
- 增加节点非空判断,避免匹配不到对应标签时触发报错
- 明确字典存储结构,用列表类型字段存储多条爬取结果,避免数据覆盖
- 异常分支保留字典结构一致性,保证
n_words字段赋值时变量始终为字典类型
修复后的可运行代码:
import requests from bs4 import BeautifulSoup as BS URL = "https://www.coach.com/shop/women/handbags/view-all" headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'} page = requests.get(URL, headers=headers) html_content = page.text soup = BS(html_content, "lxml") # 提前定义字典存储结构,避免类型混乱 content = { "titles": [], "paragraphs": [], "n_words": 0 } text_counter = 0 try: # 统计h2标签及对应后续p标签词数 for y in soup.find_all("h2"): title_text = y.get_text(strip=True) text_counter += len(title_text.split()) content["titles"].append(title_text) next_p = y.findNext('p') if next_p: p_text = next_p.get_text(strip=True) text_counter += len(p_text.split()) content["paragraphs"].append(p_text) # 统计h3标签及对应后续p标签词数 for q in soup.find_all("h3"): title_text = q.get_text(strip=True) text_counter += len(title_text.split()) content["titles"].append(title_text) next_p = q.findNext('p') if next_p: p_text = next_p.get_text(strip=True) text_counter += len(p_text.split()) content["paragraphs"].append(p_text) content["n_words"] = text_counter except Exception as e: content["n_words"] = "" print(f"统计过程出现错误: {str(e)}")
修复说明
- 所有爬取到的标题、段落文本都存入content字典下的对应列表,不会修改content本身的字典类型,无论走正常逻辑还是异常分支,给
content["n_words"]赋值都不会触发类型错误 - 文本提取时增加
strip=True参数,自动去除首尾空白、换行符,词数统计结果更准确 - 增加p标签非空判断,遇到标题后无紧跟p标签的场景不会中断程序运行
- 避免重复调用
findNext和get_text方法,代码执行效率更高
内容的提问来源于stack exchange,提问作者edyvedy13
相关产品推荐
相关产品推荐

