2011-07-18 2 views
0

URL에서 일부 파일을 다운로드하기 위해 코드를 작성했습니다. 그러나 스크립트를 실행하면 끝까지 갈 때를 제외하고는 모든 것이 잘 실행됩니다 파일을 다운로드하면 이름 중 하나를 사용하여 하나의 파일을 생성 한 다음 파일이 커지고 크기가 커지는 것을 확인한 다음 다시 작아집니다. 이 파일 (mp4)은 항상 재생할 수 없거나 손상되어 있으며, 오직 하나만 있습니다. 다른 파일로 이동하지 않습니다. 무슨 일있어? 내 생각 엔 어떻게 든 파이썬은 하나의 로컬 파일에 다른 파일을 계속 다운로드하고 덮어 쓰며, 나는 왜 그런지 이해하지 못한다. 당신이 대신 원하는 것은재미있는 동작은 파이썬에서 dict에 urlretrieve를 사용합니다.

import sys 
import os 
import re 
import urllib 
import urllib.request 


urlfilebytes = urllib.request.urlopen('http://www.pbs.org/wgbh/nova/sciencenow/download/index.html') 
urlfile = urlfilebytes.read().decode('utf-8') 
urls = re.findall(r'(http://www-tc.pbs.org/wgbh/nova/sciencenow/media/downloads/\S+)"', urlfile) 
print(urls) 
names = re.findall(r'NSN_\S+.mp4', str(urls)) 
print(names) 
names_to_urls = {} 
for name in names: 
    for url in urls: 
    names_to_urls[name] = url 
print(names_to_urls) 
for key in names_to_urls.keys(): 
    for value in names_to_urls.values(): 
    urllib.request.urlretrieve(value, key) 
+1

첫 번째 루프는 모든 dict 항목을 마지막 url로 설정합니다. – Jacob

답변

2

당신의 루프를위한 단지입니다 : 당신은 중첩 루프를 원하지 않는

for name, url in zip(names, urls): 
    urllib.request.urlretrieve(url, name) 

: 당신이 URL의 모든 조합을 얻고 여기에

코드입니다 URL과 이름이 일치하는 쌍 대신 이름. zip(names, urls)은 각 목록의 첫 번째 항목을 취한 다음 각 목록의 두 번째 항목을 취합니다.

+0

안녕하세요, 도와 줘서 고마워, 그걸 바꿨지 만 실행하려고 할 때 ValueError가 발생했습니다. 닫힌 파일 – rab777hp

+0

읽기 http://pastebin.com/ViHRimjt는 Python 2.7에서 작동합니다. 'import urllib' 라인을'urllib.request as urllib'로 변경하면 파이썬 3에서 작동 할 것이라고 생각합니다. – agf

+0

여전히 ValueError를 받고 있습니다 : 닫힌 파일을 읽음 – rab777hp