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存储了所需的输出。我想在写的语句中有一些问题。如何解决这个问题?
请帮助。
谢谢。
答案 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))