これは実際にはYoutubeAPIの問題ではなく、Pythonの問題のようです。エラーはエンコードエラーではなく、デコードエラーであることに注意してください。あなたはPythonが(良くも悪くも)機能するように設計されている方法に出くわしました。Pythonの多くの関数は、ネイティブユニコードオブジェクトではなく8ビット文字列としてユニコードデータをキャストし、127より大きい文字を表すために16進数の\ xを使用します(そのようなメソッドの1つは、SubRipFileオブジェクトの「from_string」メソッドです。 'を使用しています。)したがって、データは依然としてUnicodeですが、オブジェクトは文字列です。このため、Unicodeオブジェクトへのキャストを強制すると(提供したサンプルコードでUnicodeオブジェクトの「join」メソッドを使用してトリガーされます)、PythonはASCIIコーデック(8ビット文字列のデフォルト)を想定します。 、
いくつかの解決策があります。
1)Pythonに、結合メソッドを実行してASCIIコーデックを想定しないように明示的に指示することはできますが、私は常にそれを正しく行う(そしてすべての場合にそれを行う)のに苦労しています。したがって、サンプルコードは試しません。
2)ネイティブのUnicodeオブジェクトを使用せずに、8ビットの文字列を使用してUnicodeデータを操作することもできます。これには、次の行を変更するだけで済みます。
body = u'\n'.join(lines[2:])
これに:
body = '\n'.join(lines[2:])
このアプローチには潜在的な欠点がありますが、繰り返しになりますが、すべての場合にそれを実行していることを確認する必要があります。また、PythonネイティブのUnicodeオブジェクトを利用することもありません(これは、コードの後半で問題になる場合とそうでない場合があります)。
3)低レベルの「コーデック」モジュールを使用して、データが8ビット文字列をいじくり回すのではなく、最初からネイティブのUnicodeオブジェクトとしてキャストされるようにすることができます。通常、このようなタスクは次の方法で実行します。
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オブジェクトを介して(コーデックモジュールがリッピングされたデータをファイルとして処理できるように)送信することで回避できます。 encode()メソッドなど。Pythonドキュメントには、これらすべてに関するかなり良いセクションがあります。
幸運を祈ります。