我在处理从不同网页(在不同站点上)获取的文本中的 unicode 字符时遇到问题。我正在使用 BeautifulSoup。
问题是错误并不总是可重现的;它有时适用于某些页面,有时,它会因抛出
UnicodeEncodeError
而呕吐。我已经尝试了几乎所有我能想到的方法,但我还没有找到任何可以一致工作而不会抛出某种 Unicode 相关错误的东西。
导致问题的代码部分之一如下所示:|| |下面是运行上面的代码片段时在某些字符串上生成的堆栈跟踪:
agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
我怀疑这是因为某些页面(或更具体地说,来自某些站点的页面)可能已编码,而其他页面可能未编码。所有网站均位于英国,提供供英国消费的数据 - 因此不存在与内化或处理非英语文本相关的问题。
Traceback (most recent call last):
File "foobar.py", line 792, in <module>
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
是否有人对如何解决此问题有任何想法我可以始终如一地解决这个问题吗?
Does anyone have any ideas as to how to solve this so that I can CONSISTENTLY fix this problem?
此错误表示正尝试将包含非 ASCII 字符(在本例中为不间断空格,
\xa0
)的 Unicode 字符串隐式编码为 ASCII。但是,ASCII 只能表示 128 个字符,并且不包含此类特殊字符。
可以通过以下方法解决此问题:
1. 了解编码和解码:
- 解码: 将字节流(例如,从网页读取的内容)转换为 Unicode 字符串。
- 编码: 将 Unicode 字符串转换回字节流(例如,用于写入文件或数据库)。
2. 在 BeautifulSoup 中指定编码:
在创建 BeautifulSoup 对象时显式指定编码,尤其是在处理可能使用不同编码的网页时。可以使用
requests
库获取网页内容并将其传递给 BeautifulSoup,同时指定编码:
import requests
from bs4 import BeautifulSoup
url = '...'
response = requests.get(url)
response.encoding = 'utf-8' # 或任何你期望的编码
soup = BeautifulSoup(response.content, 'html.parser')
# ... 你的代码 ...
3. 使用 Unicode 字符串进行处理:
在代码中始终使用 Unicode 字符串 (
u'...'
) 并仅在需要将数据写入文件或数据库或通过网络发送数据时才进行编码。
agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = u'' if agent_telno is None else agent_telno.contents[0]
p.agent_info = (agent_contact + u' ' + agent_telno).strip()
4. 在输出时显式编码:
在写入文件或打印到控制台之前,使用
encode()
方法将 Unicode 字符串显式编码为所需的编码:
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(p.agent_info.encode('utf-8'))
5. 使用
unicodedata.normalize()
处理不间断空格:
可以使用
unicodedata.normalize()
函数将不间断空格 (
\xa0
) 替换为常规空格:
import unicodedata
p.agent_info = unicodedata.normalize('NFKD', p.agent_info).strip()
通过遵循这些步骤,可以更有效地处理 Unicode 字符,并避免
UnicodeEncodeError
。请记住,始终了解代码中使用的编码并进行相应的处理。