我正在使用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文件包含的内容,因此我需要将其设置为可以将其发送到解析器中。有任何想法吗?
答案 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解析器,它非常擅长自动检测编码。