python→ Film

在专门的字幕网站上,下载字幕。

https://taicishe.com/

英语电影台词文本,下载用如下代码:

python 复制代码
import requests
from bs4 import BeautifulSoup as bs
 
wfile=open("web.txt","w",encoding="utf-8")
 
for page in range(1,7):    
    url = f"https://taicishe.com/movie-kung-fu-panda-2008?page={page}"
    print(url)
 
    # 1. 先拿到一个 Cookie(关键)
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                      "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Upgrade-Insecure-Requests": "1",
    })
     
    # 2. 第一次访问通常会被 302 或 403,拿到 Cookie 后再重试
    resp = session.get(url)
    resp.encoding="utf-8"
    if resp.status_code != 200:
        # 把 Cookie 固化到会话里再发一次
        resp = session.get(url, timeout=10)
     
    print(resp.status_code)          # 应该变成 200
 
    soup = bs(resp.text, "lxml")
## 
##    name=soup.find_all("h2")
##    for n in name:
##        print(n.get_text(),file=wfile)
    tags=soup.find_all(attrs={"class":"entry"})
    for i in tags:
        
        print(i.get_text(),file=wfile)
        print("\n",file=wfile)
wfile.close() 
 

即可完成。

寻找字幕,如射手网。

https://assrt.net/

在射手网中选择搜索日语字幕。

下载的日语电影台词字幕,整理台词:

python 复制代码
import re

def clean_subtitle_line(line):
    # 1. 处理 {数字}{数字} 格式(你第一段的台词)
    line = re.sub(r'^\{\d+\}\{\d+\}', '', line)
    
    # 2. 处理 ASS 字幕 Dialogue: 格式(你现在这段)
    if line.startswith('Dialogue:'):
        # 分割逗号,取最后一部分内容
        parts = line.split(',', 9)
        if len(parts) == 10:
            line = parts[9]
    
    # 3. 去除 {\...} 样式标签(关键!)
    line = re.sub(r'\{.*?\}', '', line)
    
    # 4. 去除首尾空白
    line = line.strip()
    
    return line

# 主处理逻辑
with open("webfilm.txt", "r", encoding="utf-8") as infile, \
     open("filmContent.txt", "w", encoding="utf-8") as outfile:
    
    for line in infile:
        cleaned = clean_subtitle_line(line)
        # 只写入非空内容
        if cleaned:
            print(cleaned, file=outfile)

这段代码能够解决字幕整理的问题。

失败的代码,如下所示:

python 复制代码
import re
def extract_last_cjk(text):
    """提取每行最后面的中文/日语字符(去除末尾标点后)"""
    # 先去除末尾空白和常见标点
    cleaned = text.rstrip(' \t\n\r。,、!?.,;:"\')】》〉」』】〕]}')
    # 匹配末尾连续的CJK字符
    match = re.search(r'[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+$', cleaned)
    return match.group() if match else ''


file=open("webfilm.txt","r",encoding="utf-8")
data=file.read()
file.close()


wfile=open("filmContent.txt","w",encoding="utf-8")
datalines=data.splitlines()
for line in datalines:
    print(f"{extract_last_cjk(line)}",file=wfile)
wfile.close()

这段代码实现作用:只提取行尾的日文,遇到带引号、括号、英文的台词就会截断 / 丢失。犯错原因在于没有认识到字幕有两种不同的形式。所以需要优化代码,如下修改。

python 复制代码
import re

# 打开文件读取所有内容
with open("webfilm.txt", "r", encoding="utf-8") as file:
    datalines = file.readlines()

# 打开文件准备写入
with open("filmContent.txt", "w", encoding="utf-8") as wfile:
    # 匹配开头 {数字}{数字} 的正则表达式
    pattern = re.compile(r'^\{\d+\}\{\d+\}')
    
    for line in datalines:
        # 去掉开头的 {数字}{数字}
        cleaned_line = pattern.sub('', line).strip()
        # 如果处理后不是空行,就写入
        if cleaned_line:
            print(cleaned_line, file=wfile)

即可完成。

相关推荐
apple-mapping10 小时前
网络RTK定位学习总结
学习·网络rtk
楚山之石11 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
海海不掉头发12 小时前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
蓝祁子yoky14 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
架构师伯子明15 小时前
Ros 学习十三:IK Demo
学习
小羊没烦恼!15 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
幼儿园蛋小黄15 小时前
从 STM32N647 的 AI 部署入门嵌入式:一条可落地的学习路线
人工智能·stm32·学习
Y.99917 小时前
电脑黑屏只有鼠标能动
学习
架构师伯子明17 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
叼烟扛炮17 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain