Python-如何解决UnicodeEncodeError

时间:2014-01-27 16:29:46

标签: python beautifulsoup

import urllib, urllib2
from bs4 import BeautifulSoup, Comment 
strg=""
iter=1
url='http://www.amazon.in/product-reviews/B00EOPJEYK/ref=cm_cr_pr_top_link_1?    ie=UTF8&pageNumber=1&showViewpoints=0&sortBy=bySubmissionDateDescending'
content = urllib2.urlopen(url).read()
soup = BeautifulSoup(content, "html.parser")
rows =soup.find_all('div',attrs={"class" : "reviewText"})
for row in soup.find_all('div',attrs={"class" : "reviewText"}):
      strg = strg +str(iter)+"." + row.text + "\n\n"
      iter=iter+1

with open('outp.txt','w') as f:
      f.write(strg)
f.close()

我要求此代码将变量strg的内容写入文件outp.txt。

相反,我得到了这个错误:

Traceback (most recent call last):
File "C:\Python27\demo_amazon.py", line 14, in <module>
f.write(strg)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 226:   ordinal not in range(128)     

strg存储了所需的输出。我想在写的语句中有一些问题。如何解决这个问题?

请帮助。

谢谢。

2 个答案:

答案 0 :(得分:2)

好吧,首先,如果你想摆脱unicode错误,你应该切换到Python 3默认为unicode字符串而不是python 2中的ascii字符串。

那就是说,为了摆脱UnicodeEncodeError例外,你应该这样做:

with open('outp.txt','w') as f:
    f.write(strg.encode('utf8'))

作为参考,请参阅that question。并尝试尽可能使用unicode字符串,以尽可能避免更改字符集,方法是使用u"this is an unicode string"代替"this is an ascii string"

因此在你的for循环中:

  strg = strg +str(iter)+"." + row.text + "\n\n"

应改为:

  strg = strg +unicode(iter)+u"." + row.text + u"\n\n"

和strg应定义为strg = u""

注意:代码中的f.close()是多余的,使用with关键字实际负责在退出with块时通过{{1}关闭文件__exit__()对象的方法。

答案 1 :(得分:1)

基本上你有一个非ASCII字符。我建议使用Unidecode,它会尝试找到违规的“最接近”的ASCII字符。所以,例如它会把é变成e。

所以你只是做

from unidecode import unidecode
f.write(unidecode(strg))