我的背景是 Perl,但我正在尝试使用 Python 和 BeautifulSoup 来开发一个新项目。
在此示例中,我试图提取和呈现单个页面中包含的链接目标和链接文本。这是来源:
table_row = u'<tr><td>{}</td><td>{}</td></tr>'.encode('utf-8')
link_text = unicode(link.get_text()).encode('utf-8')
link_target = link['href'].encode('utf-8')
line_out = unicode(table_row.format(link_text, link_target))
所有这些对 .encode('utf-8') 的显式调用都是我试图完成这项工作的尝试,但它们似乎没有帮助——我很可能完全误解了 Python 2.7 如何处理 Unicode 字符串。
反正。这工作正常,直到它在 URL 中遇到 U+2013(是的,真的)。那时它会爆炸:
Traceback (most recent call last):
File "./test2.py", line 30, in <module>
line_out = unicode(table_row.encode('utf-8').format(link_text, link_target.encode('utf-8')))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 79: ordinal not in range(128)
大概 .format(),甚至应用于 Unicode 字符串,正在玩傻瓜并尝试执行 .decode() 操作。由于 ASCII 是默认值,它正在使用它,当然它不能将 U+2013 映射到 ASCII 字符,因此......
选项似乎是删除它或将其转换为其他东西,但我真正想要的是简单地保留它。最终(这只是一个小测试用例)我需要能够展示可工作的可点击链接。
BS3 文档建议将默认编码从 ASCII 更改为 UTF-8,但阅读有关类似问题的评论,这看起来是一个非常糟糕的主意,因为它会弄乱字典。
没有使用 Python 3.2(这意味着没有 Django,我们正在考虑将其作为该项目的一部分),有什么方法可以使这项工作干净利落吗?