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

CSV存储HTML数据及pandas处理时清洗结果含乱码问题求解

错误原因
  • 你当前的代码直接对DataFrame整列html_data["data"]执行str()转换,会将pandas Series的格式化输出内容(如行索引、超长内容截断标记...)混入待解析文本,并非纯HTML内容
  • 一次性将所有行的混合HTML内容传入BeautifulSoup解析,结果无法和每行URL对应,自然会出现乱码
  • 冗余清洗逻辑:BeautifulSoup返回的.text属性已经自动剔除了所有HTML标签,后续的正则匹配<.*?>属于多余操作,反而可能破坏正常文本
正确实现方案

对每行数据单独执行解析清洗即可,可直接使用pandas的apply方法实现,修正后代码如下:

import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
import re

url_list = ["https://www.flagstaffsymphony.org/event/masterworks-v-saint-saens-and-bruckner/",
"https://www.berlinerfestspiele.de/de/berliner-festspiele/programm/bfs-gesamtprogramm/programmdetail_341787.html",
"https://www.seattlesymphony.org/en/concerttickets/calendar/2021-2022/21bar3"]

# 隐式等待只需设置一次,不需要放在循环里
driver = webdriver.Chrome('/home/ubuntu/selenium_drivers/chromedriver')
driver.implicitly_wait(2)
url_data = []

for URL in url_list:
    driver.get(URL)
    data = driver.page_source
    url_data.append([URL, data])
# 爬取完成后关闭浏览器,释放资源
driver.quit()

html_data = pd.DataFrame(url_data, columns = ['urllist', 'data'])

# 定义单行清洗函数
def clean_html(html_content):
    # 单独解析每行的HTML内容
    soup = BeautifulSoup(html_content, "lxml")
    raw_text = soup.text
    # 可根据需求补充清洗逻辑:比如替换多余的空白字符
    clean_text = re.sub(r'\s+', ' ', raw_text).strip()
    return clean_text

# 对整列应用清洗函数
html_data["cleandata"] = html_data["data"].apply(clean_html)

# 导出CSV时指定utf-8-sig编码,避免特殊字符乱码
html_data.to_csv("html_craw_result.csv", encoding="utf-8-sig", index=False)
补充说明
  • 你之前单条URL清洗正常,正是因为你当时处理的是单个HTML字符串,没有混入pandas的Series结构信息
  • 如果遇到部分网站编码特殊的情况,可以在解析BeautifulSoup时手动指定编码,比如BeautifulSoup(html_content.encode('utf-8'), "lxml")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:12:04