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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:33:21