在Apache / mod_python / Django中运行beautifulsoup4的问题

时间:2012-09-27 09:48:13

标签: python django apache beautifulsoup mod-python

我正在尝试使用Django中的BeautifulSoup版本4(使用带有mod_python的Apache2)动态呈现HTML页面。 但是,只要我将任何HTML字符串传递给BeautifulSoup构造函数(请参阅下面的代码),浏览器就会挂起等待Web服务器。我在CLI中尝试了相同的代码,它就像一个魅力。所以我猜它是与BeautifulSoups环境相关的东西,在这种情况下是Django + Apache + mod_python。

import bs4
import django.shortcuts as shortcuts

def test(request):
    s = bs4.BeautifulSoup('<b>asdf</b>')
    return shortcuts.render_to_response('test.html', {})

我已使用pip pip install beautifulsoup4安装了BeautifulSoup。我尝试使用标准的Debian软件包apt-get install python-beautifulsoup安装BeautifulSoup3,然后以下等效代码工作正常(来自浏览器和CLI)。

from BeautifulSoup import BeautifulSoup
import django.shortcuts as shortcuts

def test(request):
    s = BeautifulSoup('<b>asdf</b>')
    return shortcuts.render_to_response('test.html', {})

我查看了Apaches访问和错误日​​志,它们没有显示停止请求的信息。我还检查了/ var / log / syslog和/ var / log / messages,但没有进一步的信息。

这是我使用的Apache配置:

<VirtualHost *:80>
    DocumentRoot /home/nandersson/src
    <Directory /home/nandersson/src>
        SetHandler python-program
        PythonHandler django.core.handlers.modpython
        SetEnv DJANGO_SETTINGS_MODULE app.settings
        PythonOption django.root /home/nandersson/src
        PythonDebug On
        PythonPath "['/home/nandersson/src'] + sys.path"
    </Directory>

    <Location "/media/">
        SetHandler None
    </Location>
    <Location "/app/poc/">
        SetHandler None
    </Location>
</VirtualHost>

我不确定如何进一步调试,不确定它是否是一个bug。 任何人都有关于如何深入了解或遇到类似问题的想法?

4 个答案:

答案 0 :(得分:15)

我正在使用带有mod_python的Apache2。我通过显式传递'html.parser'来解决挂起问题。

s = bs4.BeautifulSoup('<b>asdf</b>', 'html.parser')

答案 1 :(得分:2)

这可能是Cython和mod_wsgi描述的here之间的互动,并在美丽的汤背景here中进行了探讨。以下earlier questions与您的相似。

答案 2 :(得分:2)

尝试

doc = BeautifulSoup(html, 'html5lib')

在我的情况下,'html.parser'经常会导致HTMLParseError https://groups.google.com/forum/?fromgroups=#!topic/beautifulsoup/x_L9FpDdqkc

答案 3 :(得分:1)

我在大约一年前经历过同样的问题,刚刚尝试使用新版本的BeautifulSoup 4.3.2进行了类似的设置(django + mod_wsgi + apache2),似乎问题已得到解决。< / p>