Python HTML 解析器 : UnicodeDecodeError

标签 python character-encoding html-parsing

我正在使用 HTMLParser 来解析我使用 urllib 提取的页面,并且在将某些内容传递给 HTMLParser 时遇到了 UnicodeDecodeError 异常。

我尝试使用 chardet 检测编码并转换为 asciiutf-8(docs 不似乎在说它应该是什么)。有损是可以接受的,但是虽然解码/编码行工作得很好,但我总是在 self.feed() 之后得到错误。

如果我只是打印,信息就在那里。

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)

最佳答案

确实是 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 不是白痴,他们实际上在标题中发送了正确的编码。

关于Python HTML 解析器 : UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4790078/

相关文章:

python - 在 python 中使用 beautifulsoup 单击链接

Python写递归函数

python - PyQt:导入 .xls 文件并填充 QTableWidget?

php - 在数据库中安全存储 HTML,而不影响字符编码

python - 使用 BeautifulSoup 提取值列表

python - Web.py "Hello world"不工作 - ERR_ADDRESS_INVALID

c# - 一个 Http 响应(希伯来文)字符未进行属性编码的特定站点

python - 从 python 读取 BerkleyDB 文件 : `\x01\x0b\x88\x0c\x01` ?

node.js - 使用 Node.js 获取输入 HTML 的 DOM 对象

python - 如何在请求中获取页面标题