【问题标题】:Downloading YouTube Captions with API in Python with utf-8 characters在 Python 中使用 utf-8 字符的 API 下载 YouTube 字幕
【发布时间】:2012-12-03 17:23:00
【问题描述】:

我正在使用 Jeff's demo code 来使用 YouTube API 和 Python 与我的视频的字幕进行交互。而且我的英语视频效果很好。不幸的是,当我尝试将它与具有西班牙语自动转录的视频一起使用时,其中包含 á¡ 等字符,我收到编码错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)

我的 Python 脚本顶部有 # -*- coding: utf-8 -*-,我已将 CAPTIONS_LANGUAGE_CODE 更改为 'es',但似乎该脚本仍在将其下载的 .srt 文件解释为 ascii 而不是 @987654330 @。它下载 .srt 文件的行是:

if response_headers["status"] == "200":
  self.srt_captions = SubRipFile.from_string(body)

如何让 Python 将 srt 文件视为utf-8,这样它就不会引发编码错误?

谢谢!

【问题讨论】:

  • 您是否有失败的示例视频网址?我认为它可以很好地读取 UTF 文件,但是在所有字符串连接的某个地方都失败了。 Python 2 在不告诉你的情况下将字符串来回转换为 ascii。 (顺便说一句,这是关于这个主题的精彩演讲:youtube.com/watch?v=sgHbC6udIqc
  • 哪个 Python 语句引发了 UnicodeDecodeError?您能否将您的 .srt 文件的副本放在某个地方,以便我们可以下载它以尝试重现问题?
  • 大家好,感谢您的帮助! Here 是一个失败的示例视频 URL。这里 (webspace.utexas.edu/ahw368/captions.srt) 是随附的 srt 文件。 Here 是带有行号的完整错误消息。

标签: python youtube-api


【解决方案1】:

看起来这根本不是 Youtube API 问题,而是 Python 问题。请注意,您的错误不是编码错误,而是解码错误;您偶然发现了 Python 的工作方式(无论好坏)。 Python 中的很多很多函数会将 unicode 数据转换为 8 位字符串而不是原生 unicode 对象,使用带有十六进制数字的 \x 来表示大于 127 的字符。(一种这样的方法是 SubRipFile 对象的“from_string”方法) '正在使用。)因此数据仍然是 unicode,但对象是字符串。因此,当您随后强制转换为 unicode 对象(通过在您提供的示例代码中使用 unicode 对象的 'join' 方法触发)时,Python 将采用 ascii 编解码器(8 位字符串的默认值) ,无论数据编码如何)来处理数据,然后在这些十六进制字符上引发错误。

有几种解决方案。

1) 您可以明确告诉 Python,当您运行 join 方法时不要假设使用 ascii 编解码器,但我总是在努力做到这一点(并且在每种情况下都这样做)。所以我不会尝试一些示例代码。

2) 您可以放弃本机 unicode 对象,而只使用 8 位字符串来处理您的 unicode 数据;这只需要你改变这一行:

body = u'\n'.join(lines[2:])

到这里:

body = '\n'.join(lines[2:])

不过,这种方法也有潜在的缺点 -- 同样,您必须确保在每种情况下都这样做;您也不会利用 Python 原生的 unicode 对象(这可能会或可能不会在您的代码中成为问题)。

3) 您可以使用低级“编解码器”模块来确保从一开始就将数据转换为本机 unicode 对象,而不是使用 8 位字符串。通常,您以这种方式完成这样的任务:

import codecs
f=codecs.open('captions.srt',encoding='utf-8')
l=f.readlines()
f.close()
type(l[0]) # will be unicode object rather than string object

当然,使用返回字符串的 SubRipFile 对象会很复杂,但您可以通过 StringIO 对象发送它来解决这个问题(因此编解码器模块可以将抓取的数据视为文件),使用codecs.encode() 方法等。Python 文档对所有这些都有很好的部分。

祝你好运。

【讨论】:

  • 非常感谢!我使用您的选项 2 让它工作。除了对 srtitem.py 的这些额外编辑: return self.ITEM_PATTERN % (self.index, self.start, self.end, position, self.text.decode("utf-8" )) 和 self.text = text
  • 我遇到了同样的问题 - 非 ASCII 字幕。我为我的问题找到的快速解决方法是myweirdstring.decode('utf-8')。返回一个 unicode 对象。
猜你喜欢
  • 2016-07-10
  • 2015-11-20
  • 2018-02-25
  • 2017-06-15
  • 2017-12-07
  • 2018-05-12
  • 1970-01-01
  • 2022-11-12
  • 2018-12-29
相关资源
最近更新 更多