我正在使用HTMLParser解析我使用urllib下拉的网页,并且在将一些内容传递给UnicodeDecodeError
时遇到HTMLParser
个例外。
我尝试使用chardet
来检测编码并转换为ascii
或utf-8
(docs似乎没有说它应该是什么)。丢失是可以接受的,但是当解码/编码行工作正常时,我总是在self.feed()之后得到错误。
如果我只是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
这是输出:
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)
答案 0 :(得分:17)
确实是UTF-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,Youtube不是白痴,他们实际上在标题中发送了正确的编码。
答案 1 :(得分:1)
chardet说的是什么编码?
请解释“如果我打印出来的信息就在那里”:什么是“它”?如果你可以阅读它,当你将它打印到你的控制台时它是有意义的,那么它必须是你系统的通常/默认编码;那是什么?什么操作系统?什么地方?
您能给我们一个典型的网址来进行查询,以便我们可以自己检查您所看到的内容吗?
在代码中的某个位置,您解码输出,然后使用.encode('ascii', 'ignore')
立即将其粉碎;为什么呢?