剥离操作正在从 url 中删除不应该删除的字符

Strip operation is removing a character from a url when it shouldnt be

我这里有一个奇怪的问题。我在一个 txt 文件中有一个 Youtube urls 列表,这些不是正常的 YT urls,但我相信它们是从移动设备保存的,因此它们都是这样的

https://youtu.be/A6RXqx_QtKQ

我想使用 youtube-dl 下载所有这些 url 的音频 Python 所以我只需要 11 位数字 ID 就可以得到我已经从url 是这样的:

playlist_url = []

f = open('my_songs.txt', 'r')

for line in f:
    playlist_url.append(line.strip('https://youtu.be/'))

除了 11 位数字 ID 中以 'o' 开头的任何 url 之外,这几乎适用于所有 url,例如这个

https://youtu.be/o5kO4y87Gew

数字开头的 'o' 将不存在,然后 youtube-dl 将停止工作,说找不到正确的 url 或 11 位数字 ID 以继续。所以我回去打印了 'playlist_url' 中的所有 urls 并且对于开始时带有 'o' 的两个 urls , 'o' 被剥离了只剩下 10 位数字。不过,所有其他 urls 都被剥离得很好。

为什么会这样?

根据documentationstrip() 删除指定为参数的所有字符的组合。因为 youtu.be 中有一个 o 也被删除了。

因此 strip() 不是完成这项工作的正确工具;鉴于我们知道前缀的长度,只需从字符串的开头删除适当数量的字符:

line = 'https://youtu.be/o5kO4y87Gew'
line[17:]
=> 'o5kO4y87Gew'

strip 工作正常。它从字符串的开头或结尾删除参数中的任何字符。参数中有一个"o"所以如果代码开头有一个"o",当然会被删除。

试试这个:

if line.startswih("https://youtu.be/"):
    playlist_url.append(line[17:])

要抛出另一个解决方案,这是str.rpartition的好地方。

'https://youtu.be/o5kO4y87Gew'.rpartition('/')
# ('https://youtu.be', '/', 'o5kO4y87Gew')

'https://youtu.be/o5kO4y87Gew'.rpartition('/')[-1]
# 'o5kO4y87Gew'

youtube-dl 可以很好地处理整个 URL。您可以在命令行上使用 youtube-dl https://youtu.be/A6RXqx_QtKQ --list-extractor 检查,这表明将使用正确的提取器 youtube。不需要对已经存在的 URL 进行任何剥离。