我知道这已被问过几次,但我认为我做的一切都是正确的,但仍然不起作用,所以在我临床上疯了之前我会发帖子。这是代码(它应该将HTML文件转换为txt文件并省略某些行):
fid = codecs.open(htmlFile, "r", encoding = "utf-8")
if not fid:
return
htmlText = fid.read()
fid.close()
stripped = strip_tags(unicode(htmlText)) ### strip html tags (this is not the prob)
lines = stripped.split('\n')
out = []
for line in lines: # just some stuff i want to leave out of the output
if len(line) < 6:
continue
if '*' in line or '(' in line or '@' in line or ':' in line:
continue
out.append(line)
result= '\n'.join(out)
base, ext = os.path.splitext(htmlFile)
outfile = base + '.txt'
fid = codecs.open(outfile, "w", encoding = 'utf-8')
fid.write(result)
fid.close()
谢谢!
答案 0 :(得分:0)
不确定但是通过
'\n'.join(out)
使用非unicode字符串(但是普通的旧bytes
字符串),您可能会回退到某些非UTF-8编解码器。尝试:
u'\n'.join(out)
确保您在任何地方都使用unicode对象。
答案 1 :(得分:0)
您尚未指定问题,因此这是一个完整的猜测。
strip_tags()
功能返回了什么内容?它是返回一个unicode对象,还是一个字节串?如果是后者,当您尝试将其写入文件时,可能会导致解码问题。例如,如果strip_tags()
返回utf-8编码的字节字符串:
>>> s = u'This is \xe4 test\nHere is \xe4nother line.'
>>> print s
This is ä test
Here is änother line.
>>> s_utf8 = s.encode('utf-8')
>>> f=codecs.open('test', 'w', encoding='utf8')
>>> f.write(s) # no problem with this... s is unicode, but
>>> f.write(s_utf8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/codecs.py", line 691, in write
return self.writer.write(data)
File "/usr/lib64/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 8: ordinal not in range(128)
如果这是你所看到的,你需要确保在fid.write(result)
中传递unicode,这可能意味着确保strip_tags()
返回unicode。
此外,我还注意到了其他一些事情:
如果无法打开文件, codecs.open()
将引发IOError
异常。它不会返回None,因此if not fid:
测试无效。您需要使用try/except
,理想情况下使用with
。
try:
with codecs.open(htmlFile, "r", encoding = "utf-8") as fid:
htmlText = fid.read()
except IOError, e:
# handle error
print e
并且,您从通过codecs.open()
打开的文件中读取的数据将自动转换为unicode,因此调用unicode(htmlText)
无法实现任何目标。