首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python下载utf-8字符YouTube字幕

用Python下载utf-8字符YouTube字幕
EN

Stack Overflow用户
提问于 2012-12-04 01:23:00
回答 1查看 1.5K关注 0票数 2

我使用Jeff's demo code来使用Python和YouTube来与我视频的字幕进行交互。我把它用在我的英文视频上,效果很好。不幸的是,当我尝试在我的视频中使用它,这些视频有西班牙语的自动脚本,其中包含字符,如,等,我得到一个编码错误:

代码语言:javascript
复制
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文件的行是:

代码语言:javascript
复制
if response_headers["status"] == "200":
  self.srt_captions = SubRipFile.from_string(body)

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 15:38:18

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

有几种解决方案。

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

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

代码语言:javascript
复制
body = u'\n'.join(lines[2:])

要这样做:

代码语言:javascript
复制
body = '\n'.join(lines[2:])

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

3)你可以使用低级的“编解码器”模块来确保数据从一开始就被转换为原生unicode对象,而不是摆弄8位字符串。通常,您可以通过以下方式完成此类任务:

代码语言:javascript
复制
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()方法等来解决这个问题。

祝你好运。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13688470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档