Python保存CSV时字符串逐字符存储问题的解决方法
解决Python爬虫保存BeautifulSoup内容到CSV的两个常见问题
问题1:保存标签对象到CSV,结果存的是标签本身的对象表示
直接把BeautifulSoup的Tag对象丢给CSV writer时,writer会默认调用对象的__repr__方法,最终CSV里存的是类似<p class="xxx">示例文本</p>这种对象描述,不是我们需要的文本内容。
解决办法:
提取标签里的文本,用Tag对象的.get_text()方法(推荐加strip=True去除前后空白),或者.text属性;如果需要保留完整HTML结构,就用str(tag)把标签转成字符串。
问题2:转成字符串后,CSV里的内容被逐字符拆分
这是因为CSV的writerow()方法接收的是可迭代对象(比如列表、元组),如果直接传单个字符串,字符串会被当成字符的迭代器,每个字符被拆分成单独的一列。
解决办法:
把要保存的字符串放到一个列表或元组里,比如用writerow([你的字符串]),而不是writerow(你的字符串)。
完整正确示例代码
import csv from bs4 import BeautifulSoup import requests # 示例爬取目标页面 target_url = "https://example.com" resp = requests.get(target_url) soup = BeautifulSoup(resp.text, "html.parser") # 获取页面中所有段落标签 paragraph_tags = soup.find_all("p") # 写入CSV文件 with open("爬取结果.csv", "w", encoding="utf-8", newline="") as csv_file: csv_writer = csv.writer(csv_file) # 先写表头 csv_writer.writerow(["段落内容"]) for tag in paragraph_tags: # 提取纯文本,去除前后空白 pure_text = tag.get_text(strip=True) # 把文本包装成列表,避免被拆分 csv_writer.writerow([pure_text]) # 如果需要保存完整HTML结构,替换成下面两行 # html_content = str(tag) # csv_writer.writerow([html_content])
关键注意点:
- 打开文件时加
newline="",避免Windows系统下CSV出现多余空行 - 指定
encoding="utf-8",防止中文或特殊字符乱码 - 无论存纯文本还是HTML字符串,都要包装成列表/元组再传入
writerow()
内容的提问来源于stack exchange,提问作者임민서
相关产品推荐
相关产品推荐

