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

如何递归读取目录下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指定的版本删除元素,可以在上面的脚本基础上扩展:

  1. 先从提取到的DOCTYPE判断HTML版本:
    • <!DOCTYPE html> 对应HTML5
    • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 对应HTML4严格版
    • 其他版本可以根据DOCTYPE字符串特征判断
  2. 定义对应版本要删除的元素,比如HTML5里删除旧的<center>标签,或者HTML4里删除HTML5的<header>标签(根据你的实际需求调整)
  3. 修改解析后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:06:45