使用BeautifulSoup和转换HTML实体的奇怪行为

时间:2012-11-14 09:50:03

标签: python django character-encoding beautifulsoup cherokee

从HTML转换特殊字符时遇到一个奇怪的问题。我有一个Django项目,其中文本以HTML编码的形式存储在MySQL数据库中。这是必要的,因为我不想丢失文本的任何格式。

在初步步骤中,我必须对文本进行操作,如计算位置,因此我需要先将其转换并从所有HTML标签中清除它。这是由BeautifulSoup完成的:

convertedText = str(BeautifulSoup(text.text, convertEntities=BeautifulSoup.HTML_ENTITIES))
convertedText = ''.join(BeautifulSoup(convertedText).findAll(text=True))

通过处理我的Django默认测试服务器,一切正常,但是当我在生产服务器上运行时,转换特殊字符时会有奇怪的行为。

一个例子:

测试服务器

MySQL-Query给了我:<p>bassverst&auml;rker</p>

已正确转换为:bassverstärker

制作服务器

MySQL-Query给了我:<p>bassverst&auml;rker</p>

这被错误地转换为:bassverst\ucc44rker

不知何故&auml;转换为\ucc44,这会导致错误的字符。

我的配置:

测试服务器:

  • Django内置解决方案(python manage.py runserver
  • BeautifulSoup 3.2.1
  • Python 2.6.5
  • Ubuntu 2.6.32-43-generic

生产服务器:

  • Cherokee 1.2.101
  • BeautifulSoup 3.2.1
  • python 2.7.3
  • Ubuntu 3.2.0-32-generic

因为我不知道错误发生在哪个级别,所以我想问一下是否有人可以帮助我。非常感谢提前。

1 个答案:

答案 0 :(得分:4)

我找到了解决这个问题的方法。我不知道BeautifulSoup有内置方法getText()。通过以下方式转换HTML时:

convertedText = BeautifulSoup(text.text, convertEntities=BeautifulSoup.HTML_ENTITIES).getText()

eveything在两台服务器上运行良好。虽然这很有效,但在使用问题中的示例时,知道为什么两台服务器的行为都不同会很有趣。

但是,感谢所有人。