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

