Python 为什么可以';我是否可以播放以编程方式下载的MIDI文件,但可以在手动下载时播放?

Python 为什么可以';我是否可以播放以编程方式下载的MIDI文件,但可以在手动下载时播放?,python,audio,web-crawler,midi,Python,Audio,Web Crawler,Midi,我想从这个网站下载一个项目的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.chd

我想从这个网站下载一个项目的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文件进行比较时,我遇到了以下错误:

加载数据失败=错误

但在加载手动下载的文件时,没有此类错误

编辑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: (您可以使用文本编辑器打开它。)

MIDI文件可以通过url{insert number}下载

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

for i in range(1,4992):
作为补充说明,如果请求的.mid不存在,该站点将为您提供0字节的下载“-u.mid”。所以,如果你要重复下载文件,并且希望所有文件都有,请考虑设置范围为例如100到000,如果下载的文件大小为0字节,则中断循环。
for i in range(1,100000):
    if (urllib.request.urlopen(base_url+str(i)).length == 0):
        break

手动和编程下载时,文件大小是否相同?你试过比较文件内容吗?大小是一样的。但是,如果无法打开以编程方式下载的文件,如何检查内容?毕竟这只是一首歌!我认为,检查手动下载的文件的散列值与有问题的文件的散列值,将显示它们是否实际不同。校验和是不同的。我签入显示了其中一个文件的前50个字节左右的hexdump。