0

我编写了一个小实用程序刮板,每天都会向我显示一些信息。这运行 100% 没有失败,在本地运行时完全没有问题。它打开连接,创建 BeautifulSoup 对象,抓取其内容,并将所有内容打印到屏幕上。一切都很好。

但是,当我在 App Engine 上运行相同的代码时,由于某种原因突然出现解析错误!

代码尽可能直截了当。

    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 "libs\bs4\__init__.py", line 172, in __init__
    self._feed()
  File "libs\bs4\__init__.py", line 185, in _feed
    self.builder.feed(self.markup)
  File "libs\bs4\builder\_htmlparser.py", line 150, in feed
    raise e
HTMLParseError: expected name token at u'<! /notices/notice.c', at line 51, column 3

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

4

1 回答 1

1

请参阅 BeautifulSoup 上有关安装解析器的说明。BeautifulSoup 使用第三方解析器,从系统上安装的任何内容中进行选择,并lxml给予最高优先级。

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

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

于 2013-05-17T02:51:07.557 回答