簡體   English   中英

為什么我不能以編程方式播放我下載的MIDI文件,但是當我手動下載時我可以播放它們?

[英]Why can't I play the MIDI files I have downloaded programmatically, but I can play them when I download them manually?

我想從這個網站下載一個項目的MIDI文件。 我編寫了以下代碼來下載文件:

from bs4 import BeautifulSoup
import requests
import re, os
import urllib.request
import string

base_url = "http://www.midiworld.com/files/"

base_path = 'path/where/I/will/save/the/downloaded/MIDI/files'
os.chdir(base_path + '/MIDI Files')

for i in range(1,2386):
    page = requests.get(base_url + str(i))
    soup = BeautifulSoup(page.text, "html.parser")

    li_box = soup.select("div ul li a")
    urllib.request.urlretrieve(base_url+str(i), str(i)+'.mid')

這是下載文件,但當我點擊它們播放時,它們不播放; 我收到此錯誤:

在此輸入圖像描述

但是,如果我手動下載文件(我檢查了幾個),我可以播放文件。 如果它是相關的,那些文件也有不同的名稱,而不是像我如何保存它們的數字。 這可能是原因嗎? 這些文件也不是空的,如下面的截圖所示:

在此輸入圖像描述

編輯:當我試圖加載一個程序下載的MIDI文件,以將其與網站上相應的手動下載的MIDI文件進行比較時,我收到此錯誤:

Failed to load data=error

但加載手動下載的錯誤時沒有這樣的錯誤。

編輯2:這是十六進制轉儲的前50個字節:

對於以編程方式下載的文件:

file name: 1.mid
mime type: 

0000-0010:  3c 21 44 4f-43 54 59 50-45 20 68 74-6d 6c 20 50  <!DOCTYP E.html.P
0000-0020:  55 42 4c 49-43 20 22 2d-2f 2f 57 33-43 2f 2f 44  UBLIC."- //W3C//D
0000-0030:  54 44 20 58-48 54 4d 4c-20 31 2e 30-20 53 74 72  TD.XHTML .1.0.Str
0000-0032:  69 63

對於相應的手動下載文件:

file name: Adson_John_-_Courtly_Masquing_Ayres.mid
mime type: 

0000-0010:  4d 54 68 64-00 00 00 06-00 01 00 0b-00 f0 4d 54  MThd.... ......MT
0000-0020:  72 6b 00 00-00 7b 00 ff-58 04 04 02-18 08 00 ff  rk...{.. X.......
0000-0030:  59 02 00 00-00 ff 51 03-07 a1 20 f0-40 ff 51 03  Y.....Q. ....@.Q.
0000-0032:  09 27

您的代碼工作正常,只需將base_url更改為

base_url = "http://www.midiworld.com/download/"

現在,即“1.mid”包含此站點的HTML: http//www.midiworld.com/files/1 (您可以使用文本編輯器打開它。)

MIDI文件可以下載到網址http://www.midiworld.com/download/ {insert number}

我下載了前100個,但似乎目前有4992個可下載的midi文件,所以如果你想要更多文件,只需更改即可

for i in range(1,4992):

作為旁注,如果請求的.mid不存在,該站點將為您提供下載“_-_.mid”,即0字節。 因此,如果您要重復下載文件並且想要他們擁有的所有文件,請考慮將范圍設置為例如100 000,如果下載的文件大小為0字節則中斷循環。

for i in range(1,100000):
    if (urllib.request.urlopen(base_url+str(i)).length == 0):
        break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM