UnicodeDecodeError:Python HTML解析

时间:2014-02-11 01:47:20

标签: python html

我正在使用HTMLParser类中的html.parser从html文件集合中获取数据。它很顺利,直到文件出现并引发错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8a in position 419: invalid start byte

我的代码如下:

class customHTML(HTMLParser):
   # Parses the Data found
   def handle_data(self, data):
        data = data.strip()
        if(data):
            splitData = data.split()
            # Remove punctuation!
            for i in range(len(splitData)):
                splitData[i] = re.sub('[%s]' % re.escape(string.punctuation), '', splitData[i])
            newCounter = Counter(splitData)
            global wordListprint 
            wordList += newCounter

这是主要的:

for aFile in os.listdir(inputDirectory):
    if aFile.endswith(".html"):     
        parser = customHTML(strict=False)
        infile = open(inputDirectory+"/"+aFile)
        for line in infile:
            parser.feed(line)

然而,在parser.feed(line)上,所有内容都会中断。 它始终与UnicodeDecodeError相同。 我无法控制html文件包含的内容,因此我需要将其设置为可以将其发送到解析器中。有任何想法吗?

2 个答案:

答案 0 :(得分:0)

这是一个相对常见的问题,有很多SO线程。看看这个:Determine the encoding of text in Python

我想花点时间评论一下你的代码。

Python不需要在条件语句周围使用括号。使用

if foo:
    action()

if (foo):
    action()

你应该在函数/方法的顶部定义一次全局的使用,而不是每次都通过循环。

此代码:

for i in range(len(splitData)):
    splitData[i] = re.sub('[%s]' % re.escape(string.punctuation), '', splitData[i])

最好写成

for i, data in enumerate(splitData):
    splitData[i] = re.sub('[%s]' % re.escape(string.punctuation), '', data)

splitData = [ re.sub('[%s]' % re.escape(string.punctuation), '', data) 
              for data in splitData ]

答案 1 :(得分:0)

虽然子类化HTMLParser可能是一个很好的练习,但如果你的html不是utf8,我建议使用BeautifulSoup解析器,它非常擅长自动检测编码。