为什么我用编程方式下载的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 文件以将其与 this 网站中相应的手动下载的 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 文件 url http://www.midiworld.com/download/{插入数字}
我下载了前 100 个,但目前似乎有 4992 个可下载的 midi 文件,所以如果您想要更多文件,只需更改
for i in range(1,4992):
作为旁注,如果请求的 .mid 不存在,该站点会为您提供 0 字节的下载“_-_.mid”。因此,如果您要重复下载文件并且想要它们拥有的所有文件,请考虑将范围设置为例如 100 000 并在下载的文件大小为 0 字节时中断循环。
for i in range(1,100000):
if (urllib.request.urlopen(base_url+str(i)).length == 0):
break
我想从这个网站下载一个项目的 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 文件以将其与 this 网站中相应的手动下载的 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 文件 url http://www.midiworld.com/download/{插入数字}
我下载了前 100 个,但目前似乎有 4992 个可下载的 midi 文件,所以如果您想要更多文件,只需更改
for i in range(1,4992):
作为旁注,如果请求的 .mid 不存在,该站点会为您提供 0 字节的下载“_-_.mid”。因此,如果您要重复下载文件并且想要它们拥有的所有文件,请考虑将范围设置为例如 100 000 并在下载的文件大小为 0 字节时中断循环。
for i in range(1,100000):
if (urllib.request.urlopen(base_url+str(i)).length == 0):
break