json “ascii”编解码器无法编码字符:序数不在范围内(128)

xpcnnkqh  于 2023-03-24  发布在  其他
关注(0)|答案(4)|浏览(296)

我正在使用selenium和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)

当我到达此链接时:https://www.bandsintown.com/e/100778334-jean-deaux-music-at-rickshaw-stop?came_from=257&utm_medium=web&utm_source=home&utm_campaign=event
代码中断,我得到以下错误:

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')

没有成功。我相信是链接上的ï字符导致了这个失败。有人能简要给予一下发生了什么,编码/解码意味着什么,以及如何解决这个问题吗?

iezvtpos

iezvtpos1#

在shell中运行python脚本之前,您可能需要设置PYTHONIOENCODING。例如,我在将python脚本输出重定向到日志文件时遇到了相同的错误:

$ your_python_script > output.log
'ascii' codec can't encode characters in position xxxxx-xxxxx: ordinal not in range(128)

在shell中将PYTHONIOENCODING更改为UTF8后,脚本执行时没有ASCII编解码器错误:

$ export PYTHONIOENCODING=utf8

$ your_python_script > output.log
xqnpmsa8

xqnpmsa82#

你的问题是,在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()。)
有三种方法可以解决这个问题:
1.使用Python 3。Python 3中strunicode的统一使您现有的代码按原样工作;不需要代码改变。
1.从对json.dump的调用中删除ensure_ascii=False。非ASCII字符将以转义形式写入文件-例如,ï将被写入\u00ef。这是表示Unicode字符的一种非常有效的方式,大多数JSON库都可以很好地处理它。
1.将file对象 Package 为UTF-8 StreamWriter

import codecs
with codecs.getwriter("utf8")(open("testScrape.json", "w")) as writeJSON:
    json.dump(item, writeJSON, ensure_ascii=False)
0kjbasz6

0kjbasz63#

我在gitlab中运行管道时遇到了同样的问题(在Github Action,Circle CI或其他管道中从未见过此错误)
最后通过这种方式修复

before_script:
    - apt-get clean && apt-get update && apt-get install -y locales
    - echo "en_US UTF-8" > /etc/locale.gen
    - locale-gen en_US.UTF-8
    - export LANG=en_US.UTF-8
    - export LANGUAGE=en_US:en
    - export LC_ALL=en_US.UTF-8
qjp7pelc

qjp7pelc4#

pip install unidecode

from unidecode import unidecode

for col in ['column1', 'column2']:
    df[col] = df[col].apply(unidecode)

如果这是一个pandas对象,那么只需将列的名称放在[]中,将其作为列表传递..因为我今天遇到了同样的问题,并解决了这个问题。

相关问题