如何使用Python lxml与XPath批量递归清理本地HTML文件内容
基于lxml的HTM文件批量清理实现方案
注意:测试时建议先备份原文件,或者修改写入路径避免直接覆盖原文件导致内容丢失
完整可运行代码
#!/usr/bin/python import os import lxml.html as lh # 替换为你要处理的目录路径 path = '/path/to/directory' # 整理所有待删除元素的XPath规则 remove_xpaths = [ # 删除ID为box、columnRight、adbox、footer的div '//div[@id="box" or @id="columnRight" or @id="adbox" or @id="footer"]', # 删除class为box的div(精确匹配) '//div[@class="box"]', # 如需模糊匹配class包含box的div,可替换使用下方规则: # '//div[contains(concat(" ", normalize-space(@class), " "), " box ")]', # 删除所有样式表(内嵌style+外链css) '//style', '//link[@rel="stylesheet"]', # 删除所有脚本标签 '//script' ] for root, dirs, files in os.walk(path): for name in files: if name.endswith(".htm"): # 拼接生成文件的绝对路径 file_path = os.path.join(root, name) # 解析HTML构建DOM树 doc = lh.parse(file_path) # 按规则批量删除元素 for xpath in remove_xpaths: for element in doc.xpath(xpath): # 规避元素已被删除导致的父节点不存在报错 parent_node = element.getparent() if parent_node is not None: parent_node.remove(element) # 将修改后的DOM写回原文件 doc.write(file_path, encoding='utf-8', pretty_print=True, method="html")
核心调整说明
- 补全了文件路径拼接逻辑,使用
os.path.join(root, name)生成每个htm文件的完整路径,解决遍历多级子目录时的路径错误问题 - 统一整理所有待删除元素的XPath规则,后续需要新增删除规则只要在
remove_xpaths列表中追加即可,维护更方便 - 增加父节点存在性校验,避免前置规则已经删除当前元素的父节点时程序抛出异常
- 输出时指定
encoding='utf-8'避免中文乱码,pretty_print=True会自动格式化HTML结构,不需要可以删除该参数
内容的提问来源于stack exchange,提问作者Lexx Luxx
相关产品推荐
相关产品推荐

