2012-07-17 10 views
6

यह सरल अजगर 3 स्क्रिप्ट:मैं ValueError को कैसे ठीक करूं: बंद फ़ाइल अपवाद को पढ़ा?

import urllib.request 

host = "scholar.google.com" 
link = "/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0" 
url = "http://" + host + link 
filename = "cite0.bib" 
print(url) 
urllib.request.urlretrieve(url, filename) 

इस अपवाद को जन्म देती है:

Traceback (most recent call last): 
    File "C:\Users\ricardo\Desktop\Google-Scholar\BibTex\test2.py", line 8, in <module> 
    urllib.request.urlretrieve(url, filename) 
    File "C:\Python32\lib\urllib\request.py", line 150, in urlretrieve 
    return _urlopener.retrieve(url, filename, reporthook, data) 
    File "C:\Python32\lib\urllib\request.py", line 1597, in retrieve 
    block = fp.read(bs) 
ValueError: read of closed file 

मैंने सोचा था कि यह एक अस्थायी समस्या हो सकती है, तो मैं तो जैसे से निपटने के लिए कुछ सरल अपवाद कहा:

import random 
import time 
import urllib.request 

host = "scholar.google.com" 
link = "/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0" 
url = "http://" + host + link 
filename = "cite0.bib" 
print(url) 
while True: 
    try: 
     print("Downloading...") 
     time.sleep(random.randint(0, 5)) 
     urllib.request.urlretrieve(url, filename) 
     break 
    except ValueError: 
     pass 

लेकिन यह सिर्फ Downloading... विज्ञापन infinitum प्रिंट करता है।

+0

यदि आप 'http: // scholar.google.com/robots.txt' में देखते हैं तो आप देख सकते हैं कि Google इस पृष्ठ के स्वचालित डाउनलोड को रोकता है। और यदि आप 'wget' का उपयोग करने का प्रयास करते हैं तो आपको' 403 निषिद्ध 'त्रुटि मिल जाएगी। मुझे संदेह है कि यह आपकी लिपि में भी हो रहा है। –

+0

@sendle कोई एपीआई नहीं है, इसलिए मैं इसे मैन्युअल रूप से पार्स कर रहा हूं। –

+0

@sendle, सबसे अधिक संभावना है कि आपको सामग्री प्राप्त करने के लिए कुकी भेजने की आवश्यकता हो। –

उत्तर

4

आपका यूआरएल एक 403 कोड त्रुटि वापस और जाहिरा तौर पर urllib.request.urlretrieve क्योंकि यह एक urlinfo लौटने के बजाय एक त्रुटि बढ़ाकर त्रुटि निगल करने के लिए urllib.request.FancyURLopener और इस नवीनतम कोशिश उपयोग कर रहा है, सभी HTTP त्रुटियों का पता लगाने में अच्छा नहीं है।

ठीक आप अभी भी urlretrieve उपयोग करने के लिए आप FancyURLopener ओवरराइड कर सकते हैं इस तरह (कोड भी त्रुटि को दिखाने के लिए शामिल है) चाहते हैं के बारे में:

import urllib.request 
from urllib.request import FancyURLopener 


class FixFancyURLOpener(FancyURLopener): 

    def http_error_default(self, url, fp, errcode, errmsg, headers): 
     if errcode == 403: 
      raise ValueError("403") 
     return super(FixFancyURLOpener, self).http_error_default(
      url, fp, errcode, errmsg, headers 
     ) 

# Monkey Patch 
urllib.request.FancyURLopener = FixFancyURLOpener 

url = "http://scholar.google.com/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0" 
urllib.request.urlretrieve(url, "cite0.bib") 

वरना और यह है कि क्या मैं सलाह देते हैं आप urllib.request.urlopen का उपयोग कर सकते है इस प्रकार:

fp = urllib.request.urlopen('http://scholar.google.com/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0') 
with open("citi0.bib", "w") as fo: 
    fo.write(fp.read()) 
+0

सहायता के लिए धन्यवाद। +1 और बंदर पैचिंग और सामान्य सहायता के लिए स्वीकार करें, भले ही मैंने बाद में टिप्पणियों के बारे में महसूस किया है, कि 'robots.txt' उन फ़ाइलों को डाउनलोड करने की अनुमति नहीं देता है। मैं इसे पूरी तरह से भूलना भूल गया। –

संबंधित मुद्दे