python→ Language 注意代码中文件的命名方式。Windows 文件名不能包含 ! !、? ?、:、*、等特殊字符如果直接用 目标语言文本拼进了 .mp3文件名导致 open(save_path, wb)抛异常。✅ 解决思路生成安全的文件名只保留合法字符同时不影响 CSV 中原始文本。要新增一个清理文件名的函数只对“保存为 mp3 的文件名”做清洗CSV 里的 language / pronunciation保持原样顺便处理>乌尔都语代码如下import requests import re from bs4 import BeautifulSoup as bs import os # 创建mp3保存文件夹 save_dir Locense Urdu audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-urdu AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] for tr in word_rows: tds tr.find_all(td) if len(tds) ! 3: continue td_en, td_ru, td_pron tds mp3_file_name td_ru.get(data-id, ) en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, )#ru,代表语言 pron td_pron.get_text(stripTrue) # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { group_num: group_idx, category: cate_name, # 补充分类名进单条数据 english: en, language: ru, # 原ru → 修改为表头的language pronunciation: pron, mp3_filename: full_mp3_url #原ru_mp3_filename → mp3_filename } temp_words.append(word_info) # 构造文件名 save_name f{group_idx}{en}{ru}{pron}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(乌尔都语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,language,pronunciation,mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)阿拉伯语import requests import re from bs4 import BeautifulSoup as bs import os # 创建mp3保存文件夹 save_dir Locense Arab_mp3_audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-arabic AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] for tr in word_rows: tds tr.find_all(td) if len(tds) ! 3: continue td_en, td_ru, td_pron tds mp3_file_name td_ru.get(data-id, ) en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, )#ru,代表语言 pron td_pron.get_text(stripTrue) # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { group_num: group_idx, category: cate_name, # 补充分类名进单条数据 english: en, language: ru, # 原ru → 修改为表头的language pronunciation: pron, mp3_filename: full_mp3_url #原ru_mp3_filename → mp3_filename } temp_words.append(word_info) # 构造文件名 save_name f{group_idx}{en}{ru}{pron}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(阿拉伯语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,language,pronunciation,mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)日语Japanese, 表格是三列用如下代码import requests import re import os import csv from bs4 import BeautifulSoup as bs # ---------- 工具函数清洗文件名 ---------- def sanitize_filename(text: str) - str: 移除 Windows 文件名非法字符并压缩多余空格 illegal_chars r[\\/:*?|!?] text re.sub(illegal_chars, , text) text re.sub(r\s, , text) return text.strip() # 创建mp3保存文件夹 save_dir Locense mp3_audio os.makedirs(save_dir, exist_okTrue) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-japanese BASE_MP3_URL https://www.loecsen.com/OrizonFlash_V2/ressources/son/ HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } def get_page_html(): resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) topr_all soup.select(div.topr) all_data [] for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] num 1 for tr in word_rows: tds tr.find_all(td) if len(tds) ! 3: continue td_en, td_ru, td_pron tds mp3_file_name td_ru.get(data-id, ).strip() if not mp3_file_name: continue en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, ) pron td_pron.get_text(stripTrue) full_mp3_url BASE_MP3_URL mp3_file_name word_info { group_num: group_idx, category: cate_name, english: en, language: ru, pronunciation: pron, mp3_filename: full_mp3_url } temp_words.append(word_info) # ---------- ✅ 关键安全文件名 ---------- safe_en sanitize_filename(en) safe_ru sanitize_filename(ru) safe_pron sanitize_filename(pron) save_name f{group_idx}-{num}{safe_en}{safe_ru}{safe_pron}.mp3 save_path os.path.join(save_dir, save_name) # 下载 mp3 try: resp requests.get(full_mp3_url, timeout15) resp.raise_for_status() with open(save_path, wb) as f: f.write(resp.content) print(f✅ 已下载{save_name}) except Exception as e: print(f⚠️ 下载失败 {save_name}错误{e}) num 1 all_data.append({ category: cate_name, words: temp_words }) # ---------- 导出 CSV ---------- with open(日语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num, category, english, language, pronunciation, mp3_filename] writer csv.DictWriter(f, fieldnamesheaders) writer.writeheader() for group in all_data: for word_info in group[words]: writer.writerow(word_info) print(\n CSV 文件导出完成)俄语Russian, 表格是三列。代码如下import requests import re from bs4 import BeautifulSoup as bs import os # ---------- 工具函数清洗文件名 ---------- def sanitize_filename(text: str) - str: 移除 Windows 文件名非法字符并压缩多余空格 illegal_chars r[\\/:*?|!?] text re.sub(illegal_chars, , text) text re.sub(r\s, , text) return text.strip() # 创建mp3保存文件夹 save_dir ru_mp3_audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-russian#in-case-of-trouble AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename # def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] num1 for tr in word_rows: tds tr.find_all(td) if len(tds) ! 3: continue td_en, td_ru, td_pron tds mp3_file_name td_ru.get(data-id, ).strip() if not mp3_file_name: continue en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, ) pron td_pron.get_text(stripTrue) # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { english: en, russian: ru, pronunciation: pron, ru_mp3_filename: full_mp3_url, group_num: group_idx } temp_words.append(word_info) # ---------- ✅ 关键安全文件名 ---------- safe_en sanitize_filename(en) safe_ru sanitize_filename(ru) safe_pron sanitize_filename(pron) save_name f{group_idx}-{num}{safe_en}{safe_ru}{safe_pron}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) num1 all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(俄语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,russian,pronunciation,ru_mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)在loecsen网站上下载相关语言学习音频资料。西班牙语代码如下import requests import re from bs4 import BeautifulSoup as bs import os # 创建mp3保存文件夹 save_dir Locense Spanish mp3_audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-spanish AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] for tr in word_rows: tds tr.find_all(td) if len(tds) ! 2: continue td_en, td_ru tds mp3_file_name td_ru.get(data-id, ) en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, )#ru,代表语言 # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { group_num: group_idx, category: cate_name, # 补充分类名进单条数据 english: en, language: ru, # 原ru → 修改为表头的language mp3_filename: full_mp3_url #原ru_mp3_filename → mp3_filename } temp_words.append(word_info) # 构造文件名 save_name f{group_idx}{en}{ru}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(西班牙语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,language,mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)德语对于该网站中的德语音频因为网页中表格是两列所以对代码略有调整如 if len(tds) ! 2: continue。删去不必要的第三列信息。如下import requests import re from bs4 import BeautifulSoup as bs import os # 创建mp3保存文件夹 save_dir Locense mp3_audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-german AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] for tr in word_rows: tds tr.find_all(td) if len(tds) ! 2: continue td_en, td_ru tds mp3_file_name td_ru.get(data-id, ) en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, )#ru,代表语言 # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { group_num: group_idx, category: cate_name, # 补充分类名进单条数据 english: en, language: ru, # 原ru → 修改为表头的language mp3_filename: full_mp3_url #原ru_mp3_filename → mp3_filename } temp_words.append(word_info) # 构造文件名 save_name f{group_idx}{en}{ru}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(德语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,language,mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)法语代码如下import requests import re from bs4 import BeautifulSoup as bs import os # 创建mp3保存文件夹 save_dir Locense Franch mp3_audio if not os.path.exists(save_dir): os.mkdir(save_dir) # 配置参数 BASE_URL https://www.loecsen.com/en/vocabulary-french AUDIO_PREFIX https://www.loecsen.com/OrizonFlash_V2/ressources/son/ SAVE_FOLDER russian_audio HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 } base_mp3_url https://www.loecsen.com/OrizonFlash_V2/ressources/son/ # 替换成mp3真实域名拼接ru_mp3_filename def get_page_html(): 获取页面源码 resp requests.get(BASE_URL, headersHEADERS) resp.raise_for_status() resp.encoding utf-8 return resp.text html get_page_html() soup bs(html, html.parser) all_data [] topr_all soup.select(div.topr) # 遍历每一组toprgroup_idx组号从1开始 for group_idx, block in enumerate(topr_all, start1): colonnes_div block.select_one(div.colonnes) if not colonnes_div: continue cate_name colonnes_div.find(span).get_text(stripTrue) voc_wrap block.select_one(div.contentfiches.voc) if not voc_wrap: all_data.append({category: cate_name, words: []}) continue word_rows voc_wrap.select(tr[data-id]) temp_words [] for tr in word_rows: tds tr.find_all(td) if len(tds) ! 2: continue td_en, td_ru tds mp3_file_name td_ru.get(data-id, ) en td_en.get_text(stripTrue).replace(\xa0, ) ru td_ru.get_text(stripTrue).replace(\xa0, )#ru,代表语言 # 拼接mp3完整下载链接 full_mp3_url base_mp3_url mp3_file_name word_info { group_num: group_idx, category: cate_name, # 补充分类名进单条数据 english: en, language: ru, # 原ru → 修改为表头的language mp3_filename: full_mp3_url #原ru_mp3_filename → mp3_filename } temp_words.append(word_info) # 构造文件名 save_name f{group_idx}{en}{ru}.mp3 save_path os.path.join(save_dir, save_name) # 下载mp3 try: resp requests.get(full_mp3_url, timeout15) if resp.status_code 200: with open(save_path, wb) as f: f.write(resp.content) print(f✅已下载{save_name}) else: print(f❌链接失效{full_mp3_url}) except Exception as e: print(f⚠️下载失败 {save_name} ,错误:{str(e)}) all_data.append({ category: cate_name, words: temp_words }) # 导出csv import csv with open(法语词汇汇总.csv, w, encodingutf-8-sig, newline) as f: headers [group_num,category,english,language,mp3_filename] csv_w csv.DictWriter(f, fieldnamesheaders) csv_w.writeheader() for group in all_data: for word_info in group[words]: csv_w.writerow(word_info) print(\ncsv文件导出完成)即可完成。

相关新闻

最新新闻

终极指南:3步掌握WaveTools鸣潮工具箱,解锁游戏画质与抽卡分析

终极指南:3步掌握WaveTools鸣潮工具箱,解锁游戏画质与抽卡分析

终极指南:3步掌握WaveTools鸣潮工具箱,解锁游戏画质与抽卡分析 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》默认画质不够清晰、帧率不够流畅而烦恼吗?…

2026/7/24 22:48:29
融云获评“2024 年度高价值技术团队 TOP10”

融云获评“2024 年度高价值技术团队 TOP10”

12 月 13 日,InfoQ 在“AICon(全球人工智能开发与应用大会)”上重磅公布了“2024 中国技术力量年度榜单”,融云获评“2024 年度高价值技术团队 TOP10”。同登榜单的还有阿里通义灵码、美图影像研究院和京东零售技术等团队。据悉&a…

2026/7/24 22:48:29
Laguna S 2.1:基于OpenCode框架的免费开源代码辅助工具部署指南

Laguna S 2.1:基于OpenCode框架的免费开源代码辅助工具部署指南

最近在开发过程中,你是否遇到过这样的困扰:想要快速搭建一个代码辅助工具,但市面上的方案要么收费昂贵,要么配置复杂,要么功能受限?特别是对于中小团队和个人开发者来说,一个轻量级、易部署、功…

2026/7/24 22:48:29
终极指南:如何轻松访问全球最大同人创作平台AO3

终极指南:如何轻松访问全球最大同人创作平台AO3

终极指南:如何轻松访问全球最大同人创作平台AO3 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法访问Archive of Our Own(AO3)而烦恼吗?😊 作为全球…

2026/7/24 22:48:29
DP(动态规划)入门相关书籍

DP(动态规划)入门相关书籍

1、一本通 启蒙C版 2、算法训练营:入门篇(全彩版) 3、算法竞赛实战笔记(2024.01) 4、聪明人的游戏信息学探秘.提高篇-2017年06月 5、哇,编程!——跟小明一起学算法(2020.05) 6、算法入门之西游漫记——Python语言版(20…

2026/7/24 22:48:29
2026 网安学习资源大盘点,工具书单面试题全都有

2026 网安学习资源大盘点,工具书单面试题全都有

为什么你需要一套系统化的网安学习资源2026 年的网络安全行业早已不是几年前那个“靠几个脚本就能闯天下”的草莽时代。随着数字化转型的深入,企业对安全人才的需求从单纯的“会挖漏洞”变成了“懂体系、能对抗、善应急”。对于正在自学或准备转行的新人来说&#x…

2026/7/24 22:43:29

月新闻