Mam stały problem z uzyskaniem kanału RSS z konkretnej witryny. Powstaje dość brzydka procedura wykonywania tej funkcji, ale jestem ciekawy, dlaczego tak się dzieje i czy jakiekolwiek interfejsy wyższego poziomu rozwiązują ten problem prawidłowo. Ten problem nie jest tak naprawdę zakończeniem pokazu, ponieważ nie muszę często pobierać kanału.NiekompletnePrzeczytaj używając httplib
Przeczytałem rozwiązanie, które przechwytuje wyjątek i zwraca częściową zawartość, ale ponieważ niecałkowite odczyty różnią się ilością faktycznie pobranych bajtów, nie mam pewności, że takie rozwiązanie faktycznie zadziała.
#!/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)
Jak już wspomniano, nie jest to błąd krytyczny, misja, jeszcze ciekawostka, jak chociaż mogę się spodziewać urllib2 mieć ten problem, jestem zaskoczony, że ten błąd zostanie napotkany w mechanize i wniosków, a także . Moduł feedparser nie generuje nawet błędu, więc sprawdzenie błędów zależy od obecności klucza "bozo_exception".
Edycja: Chciałem tylko wspomnieć, że zarówno wget, jak i curl wykonują funkcję bezbłędnie, pobierając poprawnie cały ładunek za każdym razem. Muszę jeszcze znaleźć czystą metodę Pythona do pracy, z wyjątkiem mojego brzydkiego hacka, i jestem bardzo ciekawy, aby wiedzieć, co dzieje się na zapleczu httplib. Na skowronku, postanowiłem spróbować tego również skandować drugiego dnia i otrzymałem ten sam błąd httplib.
P.S. Jest jedna rzecz, która również uderza mnie jako bardzo dziwną. Funkcja IncompleteRead działa konsekwentnie na jednym z dwóch punktów przerwania w polu danych. Wygląda na to, że feedparser i żądania kończą się niepowodzeniem po przeczytaniu 926 bajtów, ale mechanize i urllib2 zawodzą po przeczytaniu 1854 bajtów. Takie zachowanie jest zgodne i pozostaję bez wyjaśnienia lub zrozumienia.
Chociaż zgadzam się, że nie jest to dobry sposób robienia rzeczy, to z pewnością dużo lepsze niż metoda, z której korzystałem. (Naprawdę muszę ćwiczyć częściej używając dekoratorów). Nie jestem też ekspertem od protokołów HTTP, ani też, czy httplib traktuje to poprawnie czy nie, i dlatego uznałem, że może to być dobre pytanie. FWIW, każda inna strona na tej stronie działa dobrze, i to tylko podczas uzyskiwania dostępu do rss url, że ten problem występuje na ich serwerze http. – umeboshi
@umeboshi - może jest to coś związanego z typem zawartości odpowiedzi, tj. Sposób, w jaki skonfigurowano serwer odpowiedzi 'text/html' działa dobrze, ale' text/xml' nie działa? Jeśli nie pojawią się bardziej wyczerpujące odpowiedzi, zawsze możesz spróbować umieścić to pytanie na liście dyskusyjnej Pythona i sprawdzić, czy ktoś może podać diagnozę. – Blair