首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >安装pytube后,xml到srt的转换不起作用

安装pytube后,xml到srt的转换不起作用
EN

Stack Overflow用户
提问于 2021-08-13 22:14:40
回答 2查看 620关注 0票数 1

我已经安装了pytube来从一些youtube视频中提取字幕。下面的两段代码都给出了xml标题。

代码语言:javascript
运行
AI代码解释
复制
from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=4ZQQofkz9eE')
caption = yt.captions['a.en']
print(caption.xml_captions)

也正如在文档中提到的

代码语言:javascript
运行
AI代码解释
复制
yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')
caption = yt.captions.get_by_language_code('en')
caption.xml_captions

但在这两种情况下,我都会得到xml输出以及何时使用

代码语言:javascript
运行
AI代码解释
复制
print(caption.generate_srt_captions())

我得到一个错误,如下所示。你能帮助解压srt格式吗?

代码语言:javascript
运行
AI代码解释
复制
KeyError
~/anaconda3/envs/myenv/lib/python3.6/site-packages/pytube/captions.py in 
generate_srt_captions(self)
49         recompiles them into the "SubRip Subtitle" format.
50         """
51         return self.xml_caption_to_srt(self.xml_captions)
52 
53     @staticmethod

~/anaconda3/envs/myenv/lib/python3.6/site-packages/pytube/captions.py in 
xml_caption_to_srt(self, xml_captions)
81             except KeyError:
82                 duration = 0.0
83             start = float(child.attrib["start"])
84             end = start + duration
85             sequence_number = i + 1  # convert from 0-indexed to 1.

KeyError: 'start'
EN

回答 2

Stack Overflow用户

发布于 2021-08-28 10:29:56

这是库本身的一个bug。下面的一切都是在pytube 11.01中完成的。在captions.py文件的第76行中,替换:

代码语言:javascript
运行
AI代码解释
复制
for i, child in enumerate(list(root)):

至:

代码语言:javascript
运行
AI代码解释
复制
for i, child in enumerate(list(root.findall('body/p'))):

然后在第83行,替换为:

代码语言:javascript
运行
AI代码解释
复制
duration = float(child.attrib["dur"])

至:

代码语言:javascript
运行
AI代码解释
复制
duration = float(child.attrib["d"])

然后在第86行,替换为:

代码语言:javascript
运行
AI代码解释
复制
start = float(child.attrib["start"])

至:

代码语言:javascript
运行
AI代码解释
复制
start = float(child.attrib["t"])

如果只显示行数和时间,而不显示字幕文本,则替换第77行:

代码语言:javascript
运行
AI代码解释
复制
text = child.text or ""

至:

代码语言:javascript
运行
AI代码解释
复制
text = ''.join(child.itertext()).strip()
if not text:
    continue

它适用于我,python 3.9,pytube 11.01。祝你好运!

票数 2
EN

Stack Overflow用户

发布于 2021-08-31 11:23:39

我在captions.py文件的源代码上做了一些工作。只需将此文件的整个代码替换为以下代码:

代码语言:javascript
运行
AI代码解释
复制
import math
import os
import time
import xml.etree.ElementTree as ElementTree
from html import unescape
from typing import Dict, Optional

from pytube import request
from pytube.helpers import safe_filename, target_directory


class Caption:

    def __init__(self, caption_track: Dict):

        self.url = caption_track.get("baseUrl")

        name_dict = caption_track['name']
        if 'simpleText' in name_dict:
            self.name = name_dict['simpleText']
        else:
            for el in name_dict['runs']:
                if 'text' in el:
                    self.name = el['text']

        self.code = caption_track["vssId"]

        self.code = self.code.strip('.')

    @property
    def xml_captions(self) -> str:

        return request.get(self.url)

    def generate_srt_captions(self) -> str:

        return self.xml_caption_to_srt(self.xml_captions)

    @staticmethod
    def float_to_srt_time_format(d: float) -> str:

        fraction, whole = math.modf(d/1000)
        time_fmt = time.strftime("%H:%M:%S,", time.gmtime(whole))
        ms = f"{fraction:.3f}".replace("0.", "")
        return time_fmt + ms

    def xml_caption_to_srt(self, xml_captions: str) -> str:

        segments = []
        root = ElementTree.fromstring(xml_captions)
        count_line = 0
        for i, child in enumerate(list(root.findall('body/p'))):
        
            text = ''.join(child.itertext()).strip()
            if not text:
                continue
            count_line += 1
            caption = unescape(text.replace("\n", " ").replace("  ", " "),)
            try:
                duration = float(child.attrib["d"])
            except KeyError:
                duration = 0.0
            start = float(child.attrib["t"])
            end = start + duration
            try:
                end2 = float(root.findall('body/p')[i+2].attrib['t'])
            except:
                end2 = float(root.findall('body/p')[i].attrib['t']) + duration
            sequence_number = i + 1  # convert from 0-indexed to 1.
            line = "{seq}\n{start} --> {end}\n{text}\n".format(
                seq=count_line,
                start=self.float_to_srt_time_format(start),
                end=self.float_to_srt_time_format(end2),
                text=caption,
            )
            segments.append(line)

        return "\n".join(segments).strip()

    def download(
        self,
        title: str,
        srt: bool = True,
        output_path: Optional[str] = None,
        filename_prefix: Optional[str] = None,
    ) -> str:

        if title.endswith(".srt") or title.endswith(".xml"):
            filename = ".".join(title.split(".")[:-1])
        else:
            filename = title

        if filename_prefix:
            filename = f"{safe_filename(filename_prefix)}{filename}"

        filename = safe_filename(filename)

        filename += f" ({self.code})"

        if srt:
            filename += ".srt"
        else:
            filename += ".xml"

        file_path = os.path.join(target_directory(output_path), filename)

        with open(file_path, "w", encoding="utf-8") as file_handle:
            if srt:
                file_handle.write(self.generate_srt_captions())
            else:
                file_handle.write(self.xml_captions)

        return file_path

    def __repr__(self):
        return '<Caption lang="{s.name}" code="{s.code}">'.format(s=self)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68780808

复制
相关文章
SRS+SRT从“有”到“好用”的飞跃
好的用户体验就是没有体验。 复杂性并不会消失,只会经过不断的理解学习和改善,让复杂性隐藏在一个configure和docker命令中。就像毛坯房并不能拎包入住,还需要装修、配套的商场、菜市场和学校,以及完善的交通。 致谢 SRT从无到有,是施维大神的努力。 SRT从有到好用,是志宏大神的努力。 两位大神有动力做SRT,原因之一是群里热情的SRT用户,在不断尝试和使用SRT。 问题在哪里 FFmpeg要自己编译出来,很难。 SRT要自己编译出来,比较难,因为有个钻石依赖问题(如下图),任何一步的设置或者版
Winlin
2022/03/18
9600
XML转换_xml文件转化为excel格式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171935.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
8910
XML转换_xml文件转化为excel格式
Newtonsoft中Json和Xml的转换
var user = new Dictionary<string, object> { {"CompanyName","Epoint" }, {"UserName","Ellis" }, {"Address",new Dictionary<string,string> { {"Country","China"},
happlyfox
2019/08/05
2.3K0
使用jaxb进行xml到bean的转换(尝试解决空值不显示问题)
import javax.xml.bind.Marshaller; import java.lang.reflect.Field; //监听生成xml文件过程 public class MarshallerListener extends Marshaller.Listener { public static final String BLANK_CHAR = ""; @Override public void beforeMarshal(Object source) {
JQ实验室
2022/02/10
2.5K0
xml转为excel_excel表格怎么转换xml格式
旧版的 excel 文件 Office XML是xml类型的,也称为SpreadsheetML类型,很古老的excel类型了是2002年左右的格式,现在的格式都是用的 xls 或者 xlsx。遇到的问题就是要把xml类型的 Office XML转化为 xlsx的excel,所以写了本篇文章方便以后遇到这个问题的人。
全栈程序员站长
2022/09/23
3.2K0
xml转为excel_excel表格怎么转换xml格式
XML与DataSet的相互转换类
送给大家一个XML与DataSet的相互转换的类:XmlDatasetConvert该类提供了四种网络
Java架构师必看
2021/03/22
5620
Python 提取dict转换为xml/
#!/usr/bin/python #-*- coding:gbk -*- #设置源文件输出格式 import sys import getopt import json import createDict import myConToXML import myConToTable def getRsDataToDict():     #获取控制台中输入的参数,并根据参数找到源文件获取源数据     csDict={}     try:         #通过getopt获取参数         opt
py3study
2020/01/09
8090
Django2.2搭建一个简易的网站下载youtube视频
https://github.com/nficano/pytube/issues/591
用户7010445
2020/07/10
1.1K0
XML--XML从入门到精通 Part 1 认识XML
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
风骨散人Chiam
2020/10/28
8310
C++ XML JSON格式转换
数据格式在编程里面很常见,不同的系统都会有自己的标准。因为给有各的定义,每次做第三方开发系统对接的时候数据格式标准都是头疼的事情。
宇航
2019/11/06
2.9K0
SRT字幕格式_手机srt文件怎么加入视频
[时间:2019-03] [状态:Open] [关键词:字幕,SRT,文件格式]
全栈程序员站长
2022/09/20
2.1K0
Maven配置环境变量后不起作用的原因「建议收藏」
选择图片中的Binary zip archive apache-maven-3.8.1-bin.zip进行下载并解压到本地
全栈程序员站长
2022/09/15
3.7K1
Maven配置环境变量后不起作用的原因「建议收藏」
XMl各种格式转换功能代码
package com.cdv.test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory
JQ实验室
2022/02/09
4650
XMl各种格式转换功能代码
import javax.xml.parsers.DocumentBuilder;
JQ实验室
2022/09/29
1.4K0
excel转xml工具_怎样将xml转换成excel
C:\Users\lenovo>java -version java version “1.8.0_40” Java(TM) SE Runtime Environment (build 1.8.0_40-b25) Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
全栈程序员站长
2022/09/23
1.3K0
excel转xml工具_怎样将xml转换成excel
SRT在B站的落地
大家好,我是来自哔哩哔哩的郑龙,2012年至2017年我在广播电视行业从事工作,2017年我转型至互联网行业并加入了哔哩哔哩的视频云团队。在视频云团队的三年里,主要参与了哔哩哔哩的亿秒级日吞吐视频转码系统的开发与自营视频窄带高清技术的探索,以上两项服务都已上线并长期运行。
LiveVideoStack
2021/09/01
1.2K0
SRT在B站的落地
40 - xml文档与字典之间的互相转换
1. 如何将一个字典转换为xml文档,并将该xml文档保存成文本文件 ''' dicttoxml pip install dicttixml ''' import dicttoxml from xml.dom.minidom import parseString d = [20, 'names', {'name': 'Bill', 'age': '30', 'salary': 2000}, {'name': 'Mike', 'age': '20', 'salary':
ruochen
2021/05/27
8330
40 - xml文档与字典之间的互相转换
Vue webpack打包后,css样式发生改变或不起作用
用run dev build打包后,发现样式改变了,最终发现addAdress.vue和myAdress.vue中的有个类名是相同的,但是想着
honey缘木鱼
2018/12/26
5.1K0
SRT之Rendezvous模式详解
在上一篇《如何使用高清编码器与vMix进行SRT连接》文章中详细介绍了SRT中caller模式和listener模式,近期有很多伙伴反馈,对Rendezvous模式不是特别了解,下面千视电子将分享Rendezvous传输模式。
千视kiloview
2020/05/07
1.5K0
SRT之Rendezvous模式详解
点击加载更多

相似问题

用Javascript实现.srt到.webvtt的转换

10

为什么pytube和pytube3在安装后根本不能工作?

11

解析XML字幕并转换为.srt纯文本

10

Python HTML和脚本在"import pytube“后不起作用

30

我需要帮助转换外语SRT文件到webVTT

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文