我已经编写了一个小工具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
底部的代码,以获取当前支持的解析器列表及其优先级。