python - 使用 Python 中的 API 使用 utf-8 字符下载 YouTube 字幕

标签 python youtube-api

我正在使用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 而不是 utf-8。下载 .srt 文件的行是:

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

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

谢谢!

最佳答案

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

有几种解决方案。

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

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

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

对此:

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

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

3) 您可以使用低级“编解码器”模块来确保数据从一开始就被转换为 native 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 文档对所有这些都有很好的部分。

祝你好运。

关于python - 使用 Python 中的 API 使用 utf-8 字符下载 YouTube 字幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688470/

相关文章:

python - 使用 __getattr__ 并满足子类的预期行为

python - Pandas 生成缺失的日期和时间,值为 0

python - 如何切换二维数组中的行和列?

python - 如何为 youtube python api 使用 refresh_token?

php - 使用 Zend 上传到 YouTube - 通过代理

python - 如何检查 SQLAlchemy 中的 session 当前跟踪哪些对象?

python - 测试 Graphql API - python

ajax - 使用ajax上传Ajax。 XMLHttpRequest无法加载错误

javascript - YouTube 播放器 api 中没有 onSeekTo 事件?

google-apps-script - YouTubeAnalytics.Reports.query:对关联 channel 的身份验证