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!

htl@PyMI.vn viết 19:34 ngày 30/09/2018

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ế à

htl@PyMI.vn viết 19:36 ngày 30/09/2018

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 )

Mai Anh Dũng viết 19:40 ngày 30/09/2018

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.

htl@PyMI.vn viết 19:32 ngày 30/09/2018

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

Mai Anh Dũng viết 19:38 ngày 30/09/2018

@htl mark câu trả lời của @htl làm câu trả lời đúng đi

Bài liên quan
0