求助:BeautifulSoup无法解析MS Word 365生成的.htm文件怎么办?
问题原因与解决方法
问题原因
- 编码错误引发转义异常:使用
errors='ignore'写入文件时,会忽略编码解析错误,导致HTML核心标签的<、>被错误转义为<、>,直接破坏HTML结构逻辑,让BeautifulSoup无法识别有效标签。 - Word导出HTML的格式冗余:Word 365生成的stripped类型HTML本身可能带有大量冗余空格、不规范格式标记,叠加错误写入导致的编码损坏,进一步加剧了解析失败。
正确读取与修复方法
修复转义字符并指定编码读取
修改解析函数,先修复被转义的HTML字符,再用BeautifulSoup解析:from bs4 import BeautifulSoup import html def html_parser(path): '''打开HTML文件,修复转义后返回bs4对象''' # 指定Word HTML常用编码读取内容 with open(path, 'r', encoding='utf-8') as inf: content = inf.read() # 将错误转义的<、>转回<、> content = html.unescape(content) soup = BeautifulSoup(content, 'html.parser') return soup resource = html_parser('broken.htm') print(resource) # 修正原代码变量名错误:将template改为resource table = resource.findAll('table')[-1] print(table)规范文件写入方式
后续写入文件时,避免使用errors='ignore',改用errors='replace'处理编码问题,防止关键字符丢失:with open('output.htm', 'w', encoding='utf-8', errors='replace') as outf: outf.write(content)优化Word导出设置
从Word导出HTML时,选择“清理Word特定格式标记”的选项,减少冗余空格和非标准标记,降低解析难度。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

