【问题标题】:BeautifulSoup, Python 3, encoding errorBeautifulSoup,Python 3,编码错误
【发布时间】:2015-01-29 12:40:25
【问题描述】:

我遇到了 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)

trackback 显示问题出在“BeautifulSoup(data)”语句中。

data = open(os.path.join(BASE_DIR, 'data/file.xml'))
data = BeautifulSoup(data)

BeautifulSoup 似乎尝试使用 ascii,但文件是 utf-8 编码的。我尝试了不同的方法,我可以在这里找到堆栈溢出,但它们中的大多数依赖 Python 2 - 但我使用 Python 3。我也尝试过类似的方法:

data = BeautifulSoup(str(data.read()))

但这不起作用。

非常感谢任何帮助。

【问题讨论】:

  • 您没有编码错误。您有一个de编码错误。

标签: python django python-3.x beautifulsoup lxml


【解决方案1】:

您没有编码错误。您有一个de编码错误。 open() 调用在这里确实有问题;您没有指定编码,因此使用系统默认值,而在您的系统上,默认值是 ASCII。

您想将 bytes 传递给 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:您仍然可以将解码留给 BeautifulSoup;如果 XML 文件与 UTF-8 不同,则在标签中包含其编码。
  • 我的 XML 文件中有“”。当我使用“BeautifulSoup(datafile,'xml')”时,我仍然得到错误。只有 open() 中的 "encoding="utf-8"" 对我有用。
  • @user2496550: 什么错误 你得到了什么?也许是在抱怨没有安装lxml?为什么要用 BeautifulSoup(一个 HTML 解析库)打开 XML?
猜你喜欢
  • 2016-12-28
  • 2011-08-19
  • 2015-10-07
  • 2015-11-17
  • 2013-07-25
  • 2015-07-23
  • 1970-01-01
  • 2014-10-28
  • 2014-03-14
相关资源
最近更新 更多