Python对比两个HTML文件 仅提取输出新增/缺失文本实现问题
代码调整方案
你当前使用的HtmlDiff.make_file()会默认生成包含所有上下文行的完整对比页面,要仅提取新增、缺失文本,可按以下两种场景调整:
方案1:输出仅含增删内容的纯文本结果
适合不需要保留HTML格式,仅需提取差异内容的场景:
import difflib first_file = ".../file1.html" second_file = ".../file2.html" # 读取文件时指定编码避免乱码 with open(first_file, 'r', encoding='utf-8') as f: first_file_lines = f.readlines() with open(second_file, 'r', encoding='utf-8') as f: second_file_lines = f.readlines() # 获取差分结果 diff_lines = difflib.ndiff(first_file_lines, second_file_lines) # 仅过滤增删行:- 代表旧文件有、新文件没有(缺失),+ 代表新文件有、旧文件没有(新增) only_changes = [line for line in diff_lines if line.startswith(('+', '-'))] # 写入结果 with open(".../only_changes.txt", 'w', encoding='utf-8') as f: f.writelines(only_changes)
方案2:输出仅含增删内容的HTML格式报告
如果需要保留HTML可视化格式,仅移除无差异的上下文行:
import difflib from bs4 import BeautifulSoup # 需先安装依赖:pip install beautifulsoup4 first_file = ".../file1.html" second_file = ".../file2.html" with open(first_file, 'r', encoding='utf-8') as f: first_lines = f.readlines() with open(second_file, 'r', encoding='utf-8') as f: second_lines = f.readlines() # 先生成完整的HtmlDiff报告 full_diff = difflib.HtmlDiff().make_file(first_lines, second_lines, first_file, second_file) soup = BeautifulSoup(full_diff, 'html.parser') # 过滤掉无差异的行(HtmlDiff生成的差异表中,无差异行class为none,增删行class分别为add、remove) for tr in soup.find_all('tr', class_='none'): tr.decompose() # 写入处理后的HTML with open(".../only_changes_diff.html", 'w', encoding='utf-8') as f: f.write(str(soup))
补充说明
- 如果需要保留少量上下文方便定位,可以把方案1的
difflib.ndiff替换为difflib.unified_diff,指定n参数即可设置上下文行数 - 两种方案处理1MB大小的HTML文件均无性能问题,无需额外优化
内容的提问来源于stack exchange,提问作者Filippos
相关产品推荐
相关产品推荐

