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

使用BeautifulSoup解析本地HTML文件时字符编码异常求助

问题描述

我尝试用以下代码解析本地HTML文档:

import os, sys
from bs4 import BeautifulSoup

path = os.path.abspath(os.path.dirname(sys.argv[0])) 
fnHTML = os.path.join(path, "inp.html")
page = open(fnHTML)
soup = BeautifulSoup(page.read(), 'lxml')  

worker = soup.find("span")
wHeadLine = worker.text.strip()
wPara = worker.find_next("td").text.strip()
print(wHeadLine)
print(wPara)

输出结果如下:

Find your faves—faster
We’ve made it easier than ever to see what’s on now and continue  watching your recordings, favorite teams and more.

但HTML中的文本显示为正常的“—”和“We’ve”,为何输出文本无法正常显示这些特殊字符?

原因分析

这是文件编码不匹配导致的乱码问题:

  • 你的HTML文件实际采用UTF-8编码(包含特殊Unicode字符时常用此编码),但使用open(fnHTML)打开文件时,Python默认采用了系统本地编码(比如Windows下默认是GBK)。
  • 用错误编码读取UTF-8文件时,原本的Unicode字符会被错误解码,最终输出就变成了—、’这类乱码。
解决方法

打开文件时显式指定UTF-8编码即可:

import os, sys
from bs4 import BeautifulSoup

path = os.path.abspath(os.path.dirname(sys.argv[0])) 
fnHTML = os.path.join(path, "inp.html")
# 打开文件时指定UTF-8编码
page = open(fnHTML, encoding='utf-8')
soup = BeautifulSoup(page.read(), 'lxml')  

worker = soup.find("span")
wHeadLine = worker.text.strip()
wPara = worker.find_next("td").text.strip()
print(wHeadLine)
print(wPara)

如果不确定文件编码,也可以用chardet库检测后再读取:

  1. 先安装chardet:pip install chardet
  2. 检测编码并读取:
import chardet
import os, sys
from bs4 import BeautifulSoup

path = os.path.abspath(os.path.dirname(sys.argv[0])) 
fnHTML = os.path.join(path, "inp.html")

# 检测文件编码
with open(fnHTML, 'rb') as f:
    detect_result = chardet.detect(f.read())

# 用检测到的编码打开文件
page = open(fnHTML, encoding=detect_result['encoding'])
soup = BeautifulSoup(page.read(), 'lxml')  

worker = soup.find("span")
wHeadLine = worker.text.strip()
wPara = worker.find_next("td").text.strip()
print(wHeadLine)
print(wPara)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:33:14