使用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库检测后再读取:
- 先安装chardet:
pip install chardet - 检测编码并读取:
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
相关产品推荐
相关产品推荐

