BeautifulSoup, Python 3, 编码错误

3

我在使用BeautifulSoup时遇到了编码问题。在我的开发环境中一切正常(Ubuntu,Python 3.4,Django开发服务器)。但是在生产服务器上(Ubuntu,Python 3.4,Django和BeautifulSoup的相同版本 - 唯一的区别是使用gunicorn和Nginx),我会得到以下错误:

'ascii' codec can't decode byte 0xc3 in position 301: ordinal not in range(128)

追踪反馈显示问题出在语句"BeautifulSoup(data)"中。
data = open(os.path.join(BASE_DIR, 'data/file.xml'))
data = BeautifulSoup(data)

似乎BeautifulSoup试图使用ASCII,但文件是UTF-8编码的。我尝试了在stackoverflow上找到的不同方法,但大多数都依赖于Python 2 - 而我使用Python 3。我还尝试了类似这样的方法:
data = BeautifulSoup(str(data.read()))

但是这并不起作用。 非常感谢您的任何帮助。

你没有编码错误,你有一个解码错误。 - Martijn Pieters
1个回答

0

你没有编码错误,而是有一个解码错误。问题实际上出在open()调用上;你没有指定编码,所以系统使用默认编码,在你的系统中默认编码是ASCII。

你想要传递字节给BeautifulSoup:

with open(os.path.join(BASE_DIR, 'data/file.xml'), 'rb') as datafile:
    data = BeautifulSoup(datafile)

BeautifulSoup会负责解码,以后的工作。我还把文件处理切换到了使用with语句;文件对象是上下文管理器,这样无论什么情况下都会被正确关闭。

由于您打开的是XML而不是HTML,因此您可能想通知BeautifulSoup:

with open(os.path.join(BASE_DIR, 'data/file.xml'), 'rb') as datafile:
    data = BeautifulSoup(datafile, 'xml')

你需要安装LXML才能正确运行。


感谢您的帮助!将open()语句更改为"open(os.path.join(BASE_DIR,'data/file.xml'),encoding="utf-8")"就解决了问题。 - user2496550
@user2496550:你仍然可以将解码工作交给BeautifulSoup;如果XML文件的编码与UTF-8不同,它们会在标签中包含编码信息。 - Martijn Pieters
我在我的XML文件中有"<?xml version="1.0" encoding="utf-8" ?>". 当我使用"BeautifulSoup(datafile, 'xml')"时仍然出现错误。只有在open()中使用"encoding="utf-8""才对我有效。 - user2496550
@user2496550:你收到了什么错误?也许是因为没有安装'lxml',导致的吗?为什么要使用HTML解析库BeautifulSoup来打开XML文件呢? - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接