Comment gérer IncompleteRead: en python
Je suis en train de récupérer des données à partir d'un site web. Cependant, il me renvoie incomplete read
. Les données que j'essaie d'obtenir un vaste choix de des liens imbriqués. J'ai fait quelques recherches en ligne et a constaté que cela pourrait être dû à une erreur de serveur (Un encodage de transfert en bloc de finition avant
atteindre la taille attendue). J'ai aussi trouvé une solution de contournement ci-dessus sur ce lien
Cependant, je ne suis pas sûr quant à la façon de l'utiliser pour mon cas. Voici le code, je suis en train de travailler sur
br = mechanize.Browser()
br.addheaders = [('User-agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident/5.0)')]
urls = "http://shop.o2.co.uk/mobile_phones/Pay_Monthly/smartphone/all_brands"
page = urllib2.urlopen(urls).read()
soup = BeautifulSoup(page)
links = soup.findAll('img',url=True)
for tag in links:
name = tag['alt']
tag['url'] = urlparse.urljoin(urls, tag['url'])
r = br.open(tag['url'])
page_child = br.response().read()
soup_child = BeautifulSoup(page_child)
contracts = [tag_c['value']for tag_c in soup_child.findAll('input', {"name": "tariff-duration"})]
data_usage = [tag_c['value']for tag_c in soup_child.findAll('input', {"name": "allowance"})]
print contracts
print data_usage
Merci de m'aider avec cela.Grâce
Habituellement, après je reçois le message d'erreur j'ai essayer une autre demande et il a toujours réussi. Peut-être 100 fois sur 100 essais.
OriginalL'auteur | 2013-01-21
Vous devez vous connecter pour publier un commentaire.
La lien vous avez inclus dans votre question est tout simplement un wrapper qui exécute urllib de lecture de la fonction (), qui attrape tout incomplète lire des exceptions pour vous. Si vous ne voulez pas mettre en œuvre l'ensemble de ce patch, vous pouvez toujours juste jeter dans un try/catch boucle où vous lisez vos liens. Par exemple:
pour python3
OriginalL'auteur Kyle
- Je trouver dans mon cas : envoyer des requêtes HTTP/1.0 , l'ajout de cette , de résoudre le problème.
après je fais la demande :
après je reviens de http 1.1 avec (pour les connexions de soutien 1.1) :
l'astuce est d'utiliser le protocole http 1.0 au lieu de la valeur par défaut http/1.1
http 1.1 pourrait poignée de morceaux, mais pour une raison quelconque serveur web n'est pas , de sorte que nous ne la demande en http 1.0
urllib2.urlopen(url).read()
, Mais le code ci-dessus ont résolu ce. Pouvez-vous expliquer cela ?OriginalL'auteur Sérgio
Ce qui a fonctionné pour moi est la capture de IncompleteRead comme une exception et de la récolte des données que vous avez réussi à lire à chaque itération en mettant cela dans une boucle comme ci-dessous: (Remarque, je suis à l'aide de Python 3.4.1 et la urllib bibliothèque a changé entre 2.7 et 3.4)
OriginalL'auteur gDexter42
Vous pouvez utiliser
requests
au lieu deurllib2
.requests
est basé sururllib3
donc il a rarement eu aucun problème. Le mettre dans une boucle de l'essayer 3 fois, et il sera beaucoup plus forte. Vous pouvez l'utiliser de cette façon:OriginalL'auteur Aminah Nuraini
J'ai trouvé que mon détecteur de virus/pare-feu a été à l'origine de ce problème. "En ligne" Bouclier de la partie du programme AVG.
OriginalL'auteur nigel76
J'ai essayé toutes ces solutions, et aucun d'entre eux travaillaient pour moi. En fait, ce n'travail est au lieu d'utiliser urllib, j'ai simplement utilisé le protocole http.client (Python 3)
Cela fonctionne parfaitement et à chaque fois, alors qu'avec urllib c'était au retour d'une incompleteread exception à chaque fois.
OriginalL'auteur Brian
Je viens d'ajouter un plus à l'exception de passer ce problème.
tout comme
OriginalL'auteur KJoker