У меня возникла постоянная проблема с получением 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 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 будет иметь эту проблему, я удивлен, что эта ошибка встречается и в механизации, и в запросах. Модуль feedparser даже не выдает ошибку, поэтому проверка ошибок зависит от наличия ключа "bozo_exception".
Изменить: я просто хотел упомянуть, что и wget и curl выполняют функцию безупречно, каждый раз получая полную полезную нагрузку. Мне еще предстоит найти чистый метод python для работы, за исключением моего уродливого взлома, и мне очень любопытно узнать, что происходит на бэкэнде httplib. На жаворонке я решил также попробовать это с twill на днях и получил ту же ошибку httplib.
P.S. Есть одна вещь, которая также поражает меня как очень странную. IncompleteRead последовательно выполняется на одной из двух точек останова в полезной нагрузке. Кажется, что feedparser и запросы терпят неудачу после прочтения 926 байт, но механизация и urllib2 завершаются после прочтения 1854 байта. Такое поведение является последовательным, и я остаюсь без объяснения или понимания.