【问题标题】:Python: Traceback XML-file error? and ASCII and 'ascii' codec can't encode charactersPython:回溯 XML 文件错误?和 ASCII 和 'ascii' 编解码器不能编码字符
【发布时间】:2021-02-07 21:29:10
【问题描述】:

我的第一篇文章 :o) 也是我的第一个 python 步骤。我想从 xml api 获取数据并搜索一些 youtube 视频。我找到了这个:https://youtu.be/jeZp5NE9lII?t=685(XML 部分)

我“复制”了视频中的代码(python 脚本运行的地方),以确定我是否可以从 XML API 获取信息,或者是否需要向我的 ATOM 或 Python 添加一些内容。代码如下:

import requests
import xml.etree.ElementTree as ET

url = 'http://api.worldbank.org/countries'

response = requests.get(url)
country_data = response.text

countries = ET.fromstring(country_data)

namespaces = {'wb': 'http://www.worldbank.org'}

for country in countries.findall('wb:country', namespaces):
    name = country.find('wb:name', namespaces).text
    code = country.find('wb:iso2Code', namespaces).text

print('country: {} {}'.format(name, code))

有一些错误。所以我在我的mac上安装了:

  1. sudo easy_install pip
  2. python -m pip install requests

现在我有以下错误:

  File "/var/folders/2k/ynjbnhl17pg6_wtr20l149xh0000gn/T/atom_script_tempfiles/3a3bf940-16b6-11eb-8d53-6b13b4204efb", line 30, in <module>
    countries = ET.fromstring(country_data)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1311, in XML
    parser.feed(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1657, in feed
    self._parser.Parse(data, 0)
UnicodeEncodeError: 'ascii' codec can't encode```

What I did wrong? 

【问题讨论】:

  • 你有非常非常好的理由使用 Python 2.7 编写代码吗?作为初学者,您不应该花时间学习它。 Python 3 的主要变化之一是它的 Unicode 字符串消除了许多神秘的编码和解码挑战。
  • 感谢您的提示。不,我没有理由使用 Python 2.7。实际上我已经安装了 Python 3.9。根据我的研究,Atom 转到标准版本的 Mac OS = Python 2.7,所以我在 Mac 上的 Python 2 和 3 并存:stackoverflow.com/questions/35546627/…。所以我必须在 Atom 中设置正确的 Python 版本:之后错误消息更改为我没有安装 Requests ;)
  • 这是一个预期的消息。在一个 Python 环境中安装一个模块确实可以使它在另一个环境中可用。代码很可能会有所不同。因此,在切换到 Python 3 后,转到您的 Python 2 环境,然后执行 pip list 以了解您需要在 Python 3 中执行哪些安装以复制您在 Python 2 中的内容。

标签: python xml python-2.7 character-encoding


【解决方案1】:

如果您打印response.text 的前 50 个字符,您会得到:

<?xml version="1.0" encoding="utf-8"?>
<wb:cou

开头的奇怪字符是字节顺序标记,它们的存在表明请求没有正确解码文件。不要使用response.text,而是使用response.content 将原始字节传递给elementtree:

 country_data = response.content

导致这个输出

country: China CN

【讨论】:

  • 如果您使用 Python 3 而不是 Python 2,您可能会发现使用不同的编码更容易。
猜你喜欢
  • 2015-02-03
  • 2019-09-01
  • 2017-03-31
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多