2011-01-25 20 views
12

Tôi đang sử dụng HTMLParser để phân tích các trang tôi kéo xuống bằng urllib và đang đến trên UnicodeDecodeError ngoại lệ khi chuyển một số đến HTMLParser.Python HTMLParser: UnicodeDecodeError

Tôi đã thử sử dụng chardet để phát hiện mã hóa và chuyển đổi thành ascii hoặc utf-8 (số docs dường như không cho biết nó nên là gì). lossiness là chấp nhận được, nhưng trong khi các giải mã/mã hóa dòng làm việc tốt, tôi luôn luôn nhận được lỗi sau khi self.feed().

Thông tin ở đó nếu tôi chỉ print.

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 

đây là kết quả:

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) 

Trả lời

17

Thực tế là UTF-8. Công trình này hoạt động:

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 

Bạn không cần chardet, Youtube không phải là morons, họ thực sự gửi mã hóa chính xác trong tiêu đề.

1

mã hóa gì chardet nói nó là gì?

Vui lòng giải thích "Thông tin có nếu tôi chỉ in ra": "nó" là gì? Nếu bạn có thể đọc nó và nó có ý nghĩa khi bạn in nó vào giao diện điều khiển của bạn, sau đó nó phải được trong mã hóa thông thường/mặc định cho hệ thống của bạn; đó là gì? Hệ điều hành nào? Ngôn ngữ gì?

Bạn có thể cung cấp cho chúng tôi URL điển hình để thực hiện truy vấn để chúng tôi có thể tự mình kiểm tra những gì bạn đang thấy không?

Tại một nơi trong mã của bạn, bạn giải mã đầu ra của mình, sau đó ngay lập tức đập nó bằng cách sử dụng .encode('ascii', 'ignore'); tại sao?

+0

mã tôi đã đăng bao gồm url mẫu. chardet nói url mẫu là utf-8, nhưng khi sử dụng chương trình, các mã hóa khác sẽ gặp phải (tất cả chúng đều cho cùng một lỗi unicode). Tôi có thể đọc nó và nó có ý nghĩa khi nó in ra bàn điều khiển của tôi. Ubuntu 10.10 là hệ điều hành của tôi. Tôi không có lý do giải mã/mã hóa. Tôi đang đấu tranh để hiểu điều này, và đã tìm thấy rất nhiều đề xuất xung đột thông qua google, đó là một trong số họ nguyên văn (tôi không nhớ từ đâu). cảm ơn sự giúp đỡ của bạn. P.S. 'page.decode ('utf-8'); self.feed (trang) 'cho cùng một lỗi. –

+0

Chỉ cần làm rõ, bạn đã thử 'page = page.decode ('utf-8'); self.feed (trang) '? – William

+0

có tôi có, nó đã cho tôi cùng một lỗi: 'UnicodeDecodeError: 'ascii' codec không thể giải mã byte 0xc3 ở vị trí 16688: thứ tự không nằm trong phạm vi (128)' –

Các vấn đề liên quan