使用Python腳本批量轉(zhuǎn)換網(wǎng)頁(yè)文件編碼為UTF-8
一、背景與痛點(diǎn)
當(dāng)我們使用瀏覽器的“另存為”功能保存網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)遇到以下問(wèn)題:
- 保存下來(lái)的 HTML、CSS、JS 文件使用的是本地編碼(如
GBK或GB2312); - 在現(xiàn)代開(kāi)發(fā)環(huán)境或服務(wù)器中,UTF-8 是標(biāo)準(zhǔn)編碼;
- 直接使用這些文件會(huì)導(dǎo)致 中文亂碼,影響閱讀或部署;
- 手動(dòng)逐個(gè)轉(zhuǎn)換效率極低,尤其當(dāng)網(wǎng)頁(yè)包含大量資源文件(圖片、腳本、樣式表)時(shí)。
為此,我編寫(xiě)了一個(gè) 自動(dòng)化腳本,可一鍵完成:
? 自動(dòng)檢測(cè)原始編碼
? 將文本文件轉(zhuǎn)為 UTF-8
? 二進(jìn)制文件(如圖片)原樣復(fù)制
? 完整保留源目錄結(jié)構(gòu)
二、核心思路
- 遍歷源目錄下所有文件;
- 根據(jù)文件擴(kuò)展名判斷是否為文本文件;
- 對(duì)文本文件:
- 用
chardet檢測(cè)原始編碼; - 解碼后以 UTF-8 重新寫(xiě)入目標(biāo)目錄;
- 用
- 對(duì)非文本文件(如圖片):
- 直接二進(jìn)制復(fù)制,不做任何修改;
- 使用相對(duì)路徑保持目錄結(jié)構(gòu)一致。
三、完整可運(yùn)行代碼
將以下代碼保存為 convert_webpage_to_utf8.py,放在與你的網(wǎng)頁(yè)文件夾同級(jí)目錄下即可運(yùn)行:
import os
import chardet
import shutil
# ========== 配置區(qū) ==========
SRC_DIR = "另存的網(wǎng)頁(yè)" # 源文件夾(請(qǐng)確保此目錄存在)
DST_DIR = "output_utf8" # 輸出文件夾(腳本會(huì)自動(dòng)創(chuàng)建)
# 被視為“文本文件”的擴(kuò)展名(會(huì)進(jìn)行編碼轉(zhuǎn)換)
TEXT_EXTS = (
".html", ".htm", ".css", ".js", ".txt", ".json", ".xml", ".下載"
)
# ========== 工具函數(shù) ==========
def ensure_dir_for_file(path):
"""確保文件所在目錄存在"""
dir_path = os.path.dirname(path)
if dir_path:
os.makedirs(dir_path, exist_ok=True)
def convert_text(src_path, dst_path):
"""將文本文件轉(zhuǎn)為 UTF-8"""
with open(src_path, "rb") as f:
raw = f.read()
# 自動(dòng)檢測(cè)編碼,失敗時(shí) fallback 到 gb18030(兼容 GBK/GB2312)
result = chardet.detect(raw)
enc = result.get("encoding") or "gb18030"
try:
text = raw.decode(enc, errors="ignore") # 忽略非法字符
ensure_dir_for_file(dst_path)
with open(dst_path, "w", encoding="utf-8") as f:
f.write(text)
print(f"? 文本 {src_path} [{enc}] → UTF-8")
except Exception as e:
print(f"? 文本失敗 {src_path}: {e}")
def copy_binary(src_path, dst_path):
"""直接復(fù)制二進(jìn)制文件"""
try:
ensure_dir_for_file(dst_path)
shutil.copyfile(src_path, dst_path)
print(f"?? 二進(jìn)制 {src_path} → 原樣拷貝")
except Exception as e:
print(f"? 拷貝失敗 {src_path}: {e}")
# ========== 主邏輯 ==========
if __name__ == "__main__":
if not os.path.exists(SRC_DIR):
print(f"? 源目錄 '{SRC_DIR}' 不存在,請(qǐng)檢查!")
exit(1)
for root, _, files in os.walk(SRC_DIR):
for name in files:
src = os.path.join(root, name)
rel = os.path.relpath(src, SRC_DIR) # 獲取相對(duì)于源目錄的路徑
dst = os.path.join(DST_DIR, rel) # 構(gòu)建目標(biāo)路徑
lower = name.lower()
if lower.endswith(TEXT_EXTS):
convert_text(src, dst)
else:
copy_binary(src, dst) # 非文本文件一律原樣拷貝
print(f"\n?? 處理完成!結(jié)果已保存至 '{DST_DIR}' 目錄。")
四、使用方法
安裝依賴(lài)(首次運(yùn)行需要):
pip install chardet
準(zhǔn)備數(shù)據(jù):
- 將你從瀏覽器“另存為”的整個(gè)網(wǎng)頁(yè)文件夾重命名為
另存的網(wǎng)頁(yè)(或修改腳本中的SRC_DIR); - 確保該文件夾與腳本在同一目錄下。
運(yùn)行腳本:
python convert_webpage_to_utf8.py
查看結(jié)果:
- 所有文件將被復(fù)制到
output_utf8/; - 文本文件已轉(zhuǎn)為 UTF-8 編碼,中文不再亂碼;
- 圖片、圖標(biāo)等資源保持原樣。
五、注意事項(xiàng)
.下載文件處理:某些瀏覽器(如 Chrome)會(huì)生成.xxx.download臨時(shí)文件,若其內(nèi)容是 HTML/JS,也應(yīng)轉(zhuǎn)碼;- 編碼識(shí)別容錯(cuò):
chardet對(duì)短文本可能不準(zhǔn),但對(duì)完整網(wǎng)頁(yè)通??煽浚籪allback 使用gb18030覆蓋絕大多數(shù)中文場(chǎng)景; - 安全策略:非文本文件一律不處理,避免損壞圖片、字體等二進(jìn)制資源;
- 擴(kuò)展支持:如需處理
.md、.csv等,只需在TEXT_EXTS中添加對(duì)應(yīng)后綴。
六、結(jié)語(yǔ)
這個(gè)腳本已在多個(gè)實(shí)際項(xiàng)目中驗(yàn)證,能高效解決“另存網(wǎng)頁(yè)中文亂碼”這一常見(jiàn)痛點(diǎn)。代碼簡(jiǎn)潔、健壯、易修改,適合集成到自動(dòng)化流程中。
到此這篇關(guān)于使用Python腳本批量轉(zhuǎn)換網(wǎng)頁(yè)文件編碼為UTF-8的文章就介紹到這了,更多相關(guān)Python網(wǎng)頁(yè)文件編碼轉(zhuǎn)UTF-8內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python開(kāi)源庫(kù)?Streamlit?應(yīng)用案例
Streamlit是一個(gè)開(kāi)源Python框架,專(zhuān)為數(shù)據(jù)科學(xué)家和工程師設(shè)計(jì),可快速構(gòu)建交互式Web應(yīng)用,無(wú)需前端開(kāi)發(fā)知識(shí),支持?jǐn)?shù)據(jù)可視化、模型集成、文件上傳及多種部署方式,簡(jiǎn)化了數(shù)據(jù)驅(qū)動(dòng)項(xiàng)目開(kāi)發(fā)流程,本文給大家介紹Python開(kāi)源庫(kù)Streamlit應(yīng)用案例,感興趣的朋友一起看看吧2025-09-09
python Tkinter Frame 深度解析與實(shí)戰(zhàn)避坑指南
Frame是Tkinter中最重要的容器組件,用于組織與分層界面,它支持多種布局管理器,本文給大家介紹python Tkinter Frame 深度解析與實(shí)戰(zhàn)指南,感興趣的朋友跟隨小編一起看看吧2026-02-02
python實(shí)現(xiàn)單線程多任務(wù)非阻塞TCP服務(wù)端
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)單線程多任務(wù)非阻塞TCP服務(wù)端的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Python圖像的增強(qiáng)處理操作示例【基于ImageEnhance類(lèi)】
這篇文章主要介紹了Python圖像的增強(qiáng)處理操作,結(jié)合實(shí)例形式分析了使用ImageEnhance類(lèi)處理圖片的亮度、對(duì)比度、色度以及銳度等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)
今天小編就為大家分享一篇Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python報(bào)錯(cuò)TypeError: tuple indices must be
在Python編程過(guò)程中,我們經(jīng)常會(huì)遇到各種各樣的報(bào)錯(cuò)信息,其中,“TypeError: tuple indices must be integers or slices, not str”這個(gè)報(bào)錯(cuò),對(duì)于很多開(kāi)發(fā)者來(lái)說(shuō),可能既熟悉又陌生,今天,我們就來(lái)深入探討一下這個(gè)報(bào)錯(cuò),看看它是如何產(chǎn)生的,以及如何快速有效地解決它2025-01-01
18個(gè)幫你簡(jiǎn)化代碼的Python技巧分享
選擇學(xué)習(xí)?python?時(shí),最令我震驚的是它的簡(jiǎn)單性和可讀性。但是你知道還可以用更少的代碼行可以讓?Python?代碼變得更簡(jiǎn)單嗎?本文為大家總結(jié)了18個(gè)幫你簡(jiǎn)化代碼的Python技巧,感興趣的可以了解一下2022-07-07
pd.DataFrame中的幾種索引變換的實(shí)現(xiàn)
本文主要介紹了pd.DataFrame中的幾種索引變換的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

