我一直在从特定网站获取 RSS 提要时遇到问题。我最终编写了一个相当丑陋的程序来执行此功能,但我很好奇为什么会发生这种情况以及是否有任何更高级别的接口正确处理此问题。这个问题并不是真正的阻碍,因为我不需要经常检索提要。
我已经阅读了一个捕获异常并返回部分内容的解决方案,但是由于不完整的读取在实际检索到的字节数上有所不同,我不确定这种解决方案是否真的有效。
#!/usr/bin/env python
import os
import sys
import feedparser
from mechanize import Browser
import requests
import urllib2
from httplib import IncompleteRead
url = 'http://hattiesburg.legistar.com/Feed.ashx?M=Calendar&ID=543375&GUID=83d4a09c-6b40-4300-a04b-f88884048d49&Mode=2013&Title=City+of+Hattiesburg%2c+MS+-+Calendar+(2013)'
content = feedparser.parse(url)
if 'bozo_exception' in content:
print content['bozo_exception']
else:
print "Success!!"
sys.exit(0)
print "If you see this, please tell me what happened."
# try using mechanize
b = Browser()
r = b.open(url)
try:
r.read()
except IncompleteRead, e:
print "IncompleteRead using mechanize", e
# try using urllib2
r = urllib2.urlopen(url)
try:
r.read()
except IncompleteRead, e:
print "IncompleteRead using urllib2", e
# try using requests
try:
r = requests.request('GET', url)
except IncompleteRead, e:
print "IncompleteRead using requests", e
# this function is old and I categorized it as ...
# "at least it works darnnit!", but I would really like to
# learn what's happening. Please help me put this function into
# eternal rest.
def get_rss_feed(url):
response = urllib2.urlopen(url)
read_it = True
content = ''
while read_it:
try:
content += response.read(1)
except IncompleteRead:
read_it = False
return content, response.info()
content, info = get_rss_feed(url)
feed = feedparser.parse(content)
如前所述,这不是一个关键任务问题,而是一个好奇心,因为即使我可以预期 urllib2 有这个问题,我很惊讶在 mechanize 和 requests 中也遇到了这个错误。feedparser 模块甚至不会抛出错误,因此检查错误取决于是否存在“bozo_exception”键。
编辑:我只想提一下 wget 和 curl 都完美地执行了该功能,每次都能正确检索完整的有效负载。我还没有找到一个纯 python 方法来工作,除了我丑陋的 hack,我很想知道 httplib 后端发生了什么。巧的是,前几天我决定用斜纹布也试试这个,得到了同样的 httplib 错误。
PS 还有一件事也让我觉得很奇怪。IncompleteRead 始终发生在负载中的两个断点之一。似乎 feedparser 和 requests 在读取 926 个字节后失败,但 mechanize 和 urllib2 在读取 1854 个字节后失败。这种行为是一致的,我没有解释或理解。