我正在使用硒和beautifulsoup抓取一些网页。我正在遍历一堆链接,获取信息,然后将其转储为JSON:
for event in events:
case = {'Artist': item['Artist'], 'Date': item['Date'], 'Time': item['Time'], 'Venue': item['Venue'],
'Address': item['Address'], 'Coordinates': item['Coordinates']}
item[event] = case
with open("testScrape.json", "w") as writeJSON:
json.dump(item, writeJSON, ensure_ascii=False)
代码中断,出现以下错误:
Traceback (most recent call last):
File "/Users/s/PycharmProjects/hi/BandsintownWebScraper.py", line 126, in <module>
json.dump(item, writeJSON, ensure_ascii=False)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 190, in dump
fp.write(chunk)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe6' in position 7: ordinal not in range(128)
我尝试使用:
json.dump(item, writeJSON, ensure_ascii=False).decode('utf-8')
并且:
json.dump(item, writeJSON, ensure_ascii=False).encode('utf-8')
没有成功。我相信是链接的ï字符导致此操作失败。谁能简要介绍一下正在发生的事情,编码/解码的含义以及如何解决此问题?提前致谢。
答案 0 :(得分:4)
您的问题是,在Python 2中,file
对象(由open()
返回)只能写入str
对象,不能写入unicode
对象。将ensure_ascii=False
传递到json.dump()
使其尝试将Unicode字符串作为unicode
对象直接写入文件,这将失败。
json.dump(item, writeJSON, ensure_ascii=False).encode('utf-8')
此尝试的修复不起作用,因为json.dump()
不返回任何内容。而是直接将内容写入文件。 (如果item
中没有任何Unicode文本,则会在json.dump()
完成后崩溃-json.dump()
返回None,不能调用.encode()
。 )
有三种解决方法:
使用Python3。Python3中str
和unicode
的统一使您现有的代码保持原样;无需更改代码。
从通话中将ensure_ascii=False
移至json.dump
。非ASCII字符将以转义的形式写入文件-例如,ï
将被写入\u00ef
。这是表示Unicode字符的一种完全有效的方法,大多数JSON库都可以很好地处理它。
将file
对象包装为UTF-8 StreamWriter
:
import codecs
with codecs.getwriter("utf8")(open("testScrape.json", "w")) as writeJSON:
json.dump(item, writeJSON, ensure_ascii=False)
答案 1 :(得分:1)
在外壳中运行python脚本之前,您可能需要设置PYTHONIOENCODING。 例如,在将python脚本输出重定向到日志文件时,我遇到了相同的错误:
$ your_python_script > output.log
'ascii' codec can't encode characters in position xxxxx-xxxxx: ordinal not in range(128)
在外壳中将PYTHONIOENCODING更改为UTF8后,脚本执行时没有ASCII编解码器错误:
$ export PYTHONIOENCODING=utf8
$ your_python_script > output.log