如何递归读取目录下HTML文件并提取DOCTYPE写入文本文件?
嘿,别担心,新手入门总会有卡壳的时候,我来帮你一步步搞定这个问题!
第一步:完善脚本,提取DOCTYPE并写入文本文件
你已经成功收集到了所有HTML文件的完整路径,接下来我们只需要利用这些路径,逐个解析文件提取DOCTYPE,再写入到根目录的结果文件里就行。这里是修改后的完整脚本:
import fnmatch import os from bs4 import BeautifulSoup as soup from bs4 import Doctype # 目标文件夹(你要遍历的arkivet) target_folder = "arkivet" # 结果文件保存路径(根目录下的txt文件) result_file_path = "doctype_results.txt" files_to_match = ['*.html'] matches = [] # 1. 递归遍历所有HTML文件,收集完整路径 for root, dirnames, filenames in os.walk(target_folder): for extension in files_to_match: for filename in fnmatch.filter(filenames, extension): full_file_path = os.path.join(root, filename) matches.append(full_file_path) # 2. 打开结果文件,开始写入内容 with open(result_file_path, 'w', encoding='utf-8') as result_file: # 遍历每个收集到的HTML文件 for file_path in matches: try: # 读取HTML文件内容 with open(file_path, 'r', encoding='utf-8') as html_file: html_content = html_file.read() # 用BeautifulSoup解析HTML soup_obj = soup(html_content, 'html.parser') # 提取DOCTYPE:遍历解析后的内容,找到Doctype类型的对象 doctype = None for item in soup_obj.contents: if isinstance(item, Doctype): doctype = str(item) break # 拆分路径,获取文件夹名和文件名 folder_name = os.path.basename(os.path.dirname(file_path)) file_name = os.path.basename(file_path) # 写入结果,处理没有DOCTYPE的情况 if doctype: line = f"文件夹: {folder_name} | 文件: {file_name} | DOCTYPE: {doctype}\n" else: line = f"文件夹: {folder_name} | 文件: {file_name} | DOCTYPE: 未找到\n" result_file.write(line) print(f"已处理: {file_path}") except Exception as e: # 捕获错误,避免单个文件问题导致脚本崩溃 error_line = f"文件夹: {os.path.basename(os.path.dirname(file_path))} | 文件: {os.path.basename(file_path)} | 错误: {str(e)}\n" result_file.write(error_line) print(f"处理出错: {file_path} - {str(e)}") print(f"处理完成!结果已保存到 {result_file_path}")
代码说明:
- 你之前的
matches数组已经存了所有HTML文件的完整路径,现在我们循环这个数组逐个处理文件 - 用
with open()读写文件是Python的安全操作方式,会自动帮你关闭文件 - BeautifulSoup会把DOCTYPE识别为
Doctype对象,转成字符串就能得到完整的DOCTYPE内容 - 加入了错误处理,就算某个文件无法读取,脚本也能继续运行下去
第二步:根据HTML版本删除对应元素的思路
接下来你要根据DOCTYPE指定的版本删除元素,可以在上面的脚本基础上扩展:
- 先从提取到的DOCTYPE判断HTML版本:
<!DOCTYPE html>对应HTML5<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">对应HTML4严格版- 其他版本可以根据DOCTYPE字符串特征判断
- 定义对应版本要删除的元素,比如HTML5里删除旧的
<center>标签,或者HTML4里删除HTML5的<header>标签(根据你的实际需求调整) - 修改解析后的BeautifulSoup对象,删除元素后写回原文件(注意:修改前一定要备份文件!)
举个简单例子,如果是HTML5就删除所有<font>标签:
# 放在提取DOCTYPE之后、写入结果之前 if doctype and "html" in doctype.lower(): # 判断是HTML5 # 找到所有<font>标签并删除 for font_tag in soup_obj.find_all('font'): font_tag.decompose() # 把修改后的内容写回原文件(会覆盖原文件,建议先备份!) with open(file_path, 'w', encoding='utf-8') as updated_file: updated_file.write(str(soup_obj))
运行脚本的注意事项
- 你的服务器同时有Python2和Python3,运行时要明确用Python3:
python3 your_script_name.py - 如果还没装BeautifulSoup4,用
pip3 install beautifulsoup4安装(用pip3避免装到Python2环境里)
内容的提问来源于stack exchange,提问作者Christer Johansson
相关产品推荐
相关产品推荐

