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

Python网页爬取报错TypeError: string indices must be integers求助

解决TypeError: string indices must be integers问题并成功导出CSV

嗨,我来帮你搞定这个爬取和导出的问题!你遇到的错误其实是一个很常见的变量覆盖问题,咱们一步步拆解来看:

错误原因分析

在你的循环代码里,一开始address是从addresses列表里取出的字典对象,但紧接着你执行了这行代码:

address = re.sub(r'\<.*?\>', '', address['address'])

这行代码把address变量重新赋值成了处理后的字符串(也就是清洗后的地址文本)。当你后面再尝试用address['email']去访问字典键时,变量已经变成字符串了——字符串只能用整数作为索引,所以自然就抛出了TypeError: string indices must be integers的错误。

修正方案

只需要换一个变量名来存储清洗后的地址,不要覆盖原来的字典变量就行。比如把清洗后的地址存到cleaned_address里,具体修改如下:

修正后的完整代码

from urllib.request import urlopen as uReq
import json
import re
import csv

my_url = 'https://www.haart.co.uk/umbraco/api/branches/getsales/HRT'
uClient = uReq(my_url)
page_json = uClient.read()
uClient.close()

records = []
filename = 'haartscrape.csv'

addresses = json.loads(page_json)
for address in addresses:
    headline = address['headline']
    # 用新变量存储清洗后的地址,不覆盖原字典对象
    cleaned_address = re.sub(r'\<.*?\>', '', address['address'])
    email = address['email'].strip()
    tel = address['telephone']
    records.append({'Name':headline, 'Address':cleaned_address, 'Email': email, 'Telephone':tel})

with open(filename, 'w', newline='', encoding='utf-8') as f:
    # 新增newline=''避免Windows下CSV出现空行,指定编码防止乱码
    writer = csv.DictWriter(f, ['Name', 'Address', 'Email', 'Telephone'])
    writer.writeheader()
    for r in records:
        writer.writerow(r)

额外优化说明

我还加了两个实用的小优化:

  • 打开文件时添加newline='',可以避免Windows系统下导出的CSV出现多余的空行
  • 指定encoding='utf-8',防止导出的特殊字符出现乱码问题

验证效果

运行修正后的代码,就能正常采集所有分支数据并写入haartscrape.csv文件了,每个字段都会正确对应:名称、清洗后的地址、邮箱和电话。

内容的提问来源于stack exchange,提问作者H D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:50