30/09/2018, 17:28
Xuất hiện lỗi KeyError trong Python khi upload file Python từ Windows lên CentOS
Mình viết code để lấy link download video youtube, tận dụng thư viện youtube-dl.
Đoạn code của mình như sau:
# encoding=utf8
from __future__ import unicode_literals
from flask import Flask
import sys
import youtube_dl
reload(sys)
sys.setdefaultencoding('utf8')
# download_link = 'https://www.youtube.com/watch?v=JjnMae-ODjE'
download_link = 'https://www.youtube.com/playlist?list=PLCaeNiyWNjxMMGsvVJVOF0gtn8AeOC_7y'
ydl_opts = {
'simulate': True, # Do not download
'quiet': True # Do not print messages to stdout
}
output = ""
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
# result = ydl.download([download_link])
result = ydl.extract_info(download_link)
if result['extractor'] == 'youtube:playlist':
for entry in result['entries']:
file_link = entry['url'] + '&name=' + entry['title'] + '.mp4'
file_name = entry['title']
output += "<a href='{0}' download='{1}'>{1}</a><br />".format(
file_link, file_name)
elif result['extractor'] == 'youtube':
file_link = result['url'] + '&name=' + result['title'] + '.mp4'
file_name = result['title']
output = "<a href='{0}' download='{1}'>{1}</a>".format(
file_link, file_name)
app = Flask(__name__)
@app.route('/')
def homepage():
return output
# return "abc"
if __name__ == "__main__":
app.run()
Khi mình chạy trên Windows 7 x64 thì không bị lỗi gì. Tuy nhiên khi mình upload script lên server chạy CentOS 6.5 thì bị báo lỗi:
Traceback (most recent call last):
File "youtube-dl.py", line 25, in <module>
file_link = entry['url'] + '&name=' + entry['title'] + '.mp4'
KeyError: u'url'
Mọi người giúp mình sửa lỗi và giải thích cho mình biết sao lại xuất hiện lỗi trên CentOS được ko? Thanks!
Bài liên quan
Có bạn nào gặp lỗi này khi lập trình python chưa? Giúp mình với! Trong diễn đàn ít người dùng python thế à
Xin thầy @ltd giúp đỡ (mình có theo series learn python the hard way của ltd nên xin phép gọi là thầy )
Cảm ơn @htl nhé, Đạt chưa đọc code, nhưng theo @htl nói thì nó chạy được trên Windows mà không chạy được trên Linux. Đồng thời file này upload từ máy Windows lên nên @htl kiểm tra thử cái file này có end line đúng không nhé.
Windows và Linux có cách xuống hàng khác nhau. Một cách kiểm tra là
cat
cái file đó và xem thử cuối mỗi dòng có ký tự lạ không.Cách thứ hai là tạo một file tương tự trên máy Linux bằng lệnh
touch
rồi code lại xem thử. Nếu không giải quyết được thì Đạt sẽ xem code xem sao.Mình thử cat và touch thì kết quả vẫn thế.
Lần trước chạy trên windows ra được kết quả nhưng lâu ngày quá không nhớ kết quả như nào, bây giờ chạy lại thì báo lỗi khác Python: Lỗi xuất ký tự unicode trên windows cmd
Mình đã sửa lại code để print chỗ bị lỗi ra màn hình thì thấy lỗi KeyError là vì biến dictionary đó không có key đó.
Dòng bị lỗi là trường hợp link được truyền vào là playlist. Kết quả trả về của youtube-dl là: {video1, video2, …}. Trong đó:
video1 = {các thông tin về video, trong đó có đường link}. Mình lấy video1[‘url’] bị sai vì nó trả về video1[‘requested_formats’] là 1 tuple bao gồm link của tất cả các format (360p, 720p, …). Vì vậy lỗi này chắc chỉ cần sửa là video1[‘requested_formats’][0][‘url’]
Vì mình amateur và thỉnh thoảng rỗi mới code nên bị nhiều lỗi đơn giản. @ltd thông cảm
@htl mark câu trả lời của @htl làm câu trả lời đúng đi