2011-01-25 17 views
12

मैं एचआरएलपीर्स का उपयोग कर उन पृष्ठों को पार्स करने के लिए उपयोग कर रहा हूं जो मैं urllib के साथ खींचता हूं, और पर कुछ पास करते समय UnicodeDecodeError अपवादों में आ रहा हूं।पायथन एचटीएमएल पार्सर: यूनिकोडडेकोड एरर

मैं एन्कोडिंग पता लगाने के लिए और ascii, या utf-8 कन्वर्ट करने के लिए (docs कहने के लिए यह क्या किया जाना चाहिए नहीं है) chardet उपयोग करने की कोशिश। हानि स्वीकार्य है, लेकिन जब डीकोड/एन्कोड लाइनें ठीक काम करती हैं, तो मुझे हमेशा self.feed() के बाद त्रुटि मिलती है।

जानकारी है अगर मैं सिर्फ print इसे बाहर कर रहा हूं।

Traceback (most recent call last): 
    File "test.py", line 27, in <module> 
    results = search_youtube(searches) 
    File "test.py", line 23, in __init__ 
    self.feed(page) 
    File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed 
    self.goahead(0) 
    File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead 
    k = self.parse_starttag(i) 
    File "/usr/lib/python2.6/HTMLParser.py", line 252, in parse_starttag 
    attrvalue = self.unescape(attrvalue) 
    File "/usr/lib/python2.6/HTMLParser.py", line 390, in unescape 
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s) 
    File "/usr/lib/python2.6/re.py", line 151, in sub 
    return _compile(pattern, 0).sub(repl, string, count) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128) 

उत्तर

17

यह वास्तव में यूटीएफ -8 है, वास्तव में। यह काम करता है:

from HTMLParser import HTMLParser 
import urllib 

class search_youtube(HTMLParser): 

    def __init__(self, search_terms): 
     HTMLParser.__init__(self) 
     self.track_ids = [] 
     for search in search_terms: 
      self.__in_result = False 
      search = urllib.quote_plus(search) 
      query = 'http://youtube.com/results?search_query=' 
      connection = urllib.urlopen(query + search) 
      encoding = connection.headers.getparam('charset') 
      page = connection.read().decode(encoding) 
      self.feed(page) 
      print 'success' 

searches = ['telepopmusik breathe'] 
results = search_youtube(searches) 
print results.track_ids 

आप chardet की जरूरत नहीं है, यूट्यूब बेवकूफों नहीं हैं, वे वास्तव में शीर्षक में सही एन्कोडिंग भेजें।

1

क्या एन्कोडिंग कहना chardet यह है करता है:

from HTMLParser import HTMLParser 
import urllib 
import chardet 

class search_youtube(HTMLParser): 

    def __init__(self, search_terms): 
     HTMLParser.__init__(self) 
     self.track_ids = [] 
     for search in search_terms: 
      self.__in_result = False 
      search = urllib.quote_plus(search) 
      query = 'http://youtube.com/results?search_query=' 
      page = urllib.urlopen(query + search).read() 
      try: 
       self.feed(page) 
      except UnicodeDecodeError: 
       encoding = chardet.detect(page)['encoding'] 
       if encoding != 'unicode': 
        page = page.decode(encoding) 
        page = page.encode('ascii', 'ignore') 
       self.feed(page) 
       print 'success' 

searches = ['telepopmusik breathe'] 
results = search_youtube(searches) 
print results.track_ids 

यहां उत्पादन है?

कृपया बताएं "अगर मैं इसे प्रिंट करता हूं तो जानकारी वहां है": "यह" क्या है? यदि आप इसे पढ़ सकते हैं और जब आप इसे अपने कंसोल पर प्रिंट करते हैं तो यह समझ में आता है, तो यह आपके सिस्टम के लिए सामान्य/डिफ़ॉल्ट एन्कोडिंग में होना चाहिए; वो क्या है? क्या ऑपरेटिंग सिस्टम? क्या लोकेल?

क्या आप हमें एक प्रश्न बनाने के लिए एक सामान्य यूआरएल दे सकते हैं ताकि हम आप जो देख रहे हैं उसके लिए हम निरीक्षण कर सकें?

अपने कोड में एक ही स्थान पर, आप अपना आउटपुट डीकोड करते हैं, फिर तुरंत .encode('ascii', 'ignore') का उपयोग कर इसे तोड़ दें; क्यूं कर?

+0

मेरे द्वारा पोस्ट किए गए कोड में नमूना यूआरएल शामिल है। chardet का कहना है कि नमूना यूआरएल utf-8 है, लेकिन प्रोग्राम का उपयोग करते समय, अन्य एन्कोडिंग का सामना करना पड़ता है (वे सभी एक ही यूनिकोड त्रुटि देते हैं)। मैं इसे पढ़ सकता हूं और जब यह मेरे कंसोल पर प्रिंट करता है तो यह समझ में आता है। उबंटू 10.10 मेरा ओएस है। मेरे पास डीकोड/एन्कोड के लिए कोई तर्क नहीं है। मैं इसे समझने के लिए संघर्ष कर रहा हूं, और Google के माध्यम से कई विवादित सुझाव प्राप्त हुए हैं, उनमें से एक शब्दशः (मुझे कहां से याद नहीं है)। आपकी मदद के लिए धन्यवाद। अनुलेख 'Page.decode ('utf-8'); self.feed (पेज) 'एक ही त्रुटि देता है। –

+0

बस स्पष्ट करने के लिए, आपने 'पृष्ठ = पृष्ठ.decode (' utf-8 ') की कोशिश की है; self.feed (पेज) '? – William

+0

हाँ मेरे पास है, यह मुझे एक ही त्रुटि देता है: 'यूनिकोड डीकोड त्रुटि:' ascii 'कोडेक स्थिति 16688 में बाइट 0xc3 को डीकोड नहीं कर सकता है: रिकॉर्ड के लिए क्रमशः श्रेणी में नहीं (128) ' –

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