完全迷失了方向.程序在本地100%解析html,但从应用引擎运行时失败



我已经编写了一个小工具scraper,它将每天显示一些信息。这运行100%没有失败,没有任何问题,当运行本地。它打开连接,创建BeautifulSoup对象,抓取其内容,并将所有内容打印到屏幕上。一切都很好。

然而,当我在应用引擎上运行相同的代码时,由于某种原因,我突然得到一个解析错误!

代码是非常直接的。

    url = 'MY_URL'
    agent = ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 '
        '(KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31')
    headers = {'User-Agent' : agent}
    data = urllib.urlencode(form_data)
    req = urllib2.Request(url, headers=headers, data=data)
    return urllib2.urlopen(req).read()

这打开了页面。然后使用BeautifulSoup

解析该页面。
page = get_page()
soup = BeautifulSoup(page)

就是这样。就像我说的,运行良好。我已经运行这个脚本100次本地没有问题。现在,我想把它放在App Engine上。我认为urllib请求将是一个问题,但事实证明,代码失败的地方是在BeautifulSoup调用。

AppEngines的日志显示错误:

soups = [BeautifulSoup(response) for response in responses]
  File "libsbs4__init__.py", line 172, in __init__
    self._feed()
  File "libsbs4__init__.py", line 185, in _feed
    self.builder.feed(self.markup)
  File "libsbs4builder_htmlparser.py", line 150, in feed
    raise e
HTMLParseError: expected name token at u'<! /notices/notice.c', at line 51, column 3

我已经验证,当请求从AppEngine发出时,我得到了正确的页面。所以…我完全迷路了。为什么会突然出现解析问题?

参见BeautifulSoup上关于安装解析器的说明。BeautifulSoup使用第三方解析器,从系统上安装的任何东西中进行选择,lxml具有最高优先级。

每个解析器都有它的优点和缺点,有些比其他的更宽松。很可能您在本地系统上安装了一组与AppEngine工作区域不同的解析器,并且AppEngine上使用的解析器不那么宽松。

请参阅BeautifulSoup源代码bs4/builder/__init__.py底部的代码,以获取当前支持的解析器列表及其优先级。

最新更新