web-dev-qa-db-fra.com

httplib.BadStatusLine: ''

Comme toujours, j'ai souvent des problèmes, et j'ai complètement cherché une réponse à la question actuelle, mais je me suis retrouvé perdu. Voici quelques-uns des endroits que j'ai consultés: - Comment corriger une exception httplib.BadStatusLine? - Python httplib2 Gestion des exceptions - code d'état http python

Mon problème est le suivant. J'ai créé une araignée et je veux explorer différentes URL. Lorsque je parcours chaque URL indépendamment, tout fonctionne correctement. Cependant, lorsque j'essaie d'analyser les deux, j'obtiens le message d'erreur suivant: httplib.BadStatusLine: ''

J'ai suivi certains conseils que j'ai lus (voir les liens susmentionnés) et je peux imprimer le response.status pour chaque requête, mais le response.url ne s'imprime pas et l'erreur est renvoyée. (J'imprime uniquement les deux instructions pour essayer d'identifier la source de l'erreur). 

J'espère que c'est clair. 

J'utilise scrapy et sélénium

class PeoplePage(Spider):
    name = "peopleProfile"
    allowed_domains = ["blah.com"]
    handle_httpstatus_list = [200, 404]
    start_urls = [
        "url1",
        "url2"
    ]

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        print response.status
        print '???????????????????????????????????'
        if response.status == 200:
            self.driver.implicitly_wait(5)
            self.driver.get(response.url)
            print response.url
            print '!!!!!!!!!!!!!!!!!!!!'

            # DO STUFF

        self.driver.close()
15
Jonathan Sitruk

Basé sur Python Doc , httplib.BadStatusLine généré si un serveur répond avec un code d’état HTTP que nous ne comprenons pas . Vous pouvez essayer de transmettre cette exception. Vous ne devriez pas fermer votre pilote si vous appelez plus d'une URL.

Essaye ça:

def parse(self, response):
    try:
        print response.status
        print '???????????????????????????????????'
        if response.status == 200:
            self.driver.implicitly_wait(5)
            self.driver.get(response.url)
            print response.url
            print '!!!!!!!!!!!!!!!!!!!!'

            # DO STUFF
    except httplib.BadStatusLine:
        pass
19
Nima Soroush

J'ai demandé à un décorateur de faire ce que la réponse principale fait, afin de rendre le code facilement réutilisable. C'est ici:

import http

def pass_bad_status_line_exc(wrapped_function):
    """
    Silently pass this exception `http.client.BadStatusLine` decorator
    """
    def _wrapper(*args, **kwargs):
        try:
            result = wrapped_function(*args, **kwargs)
        except http.client.BadStatusLine:
            return
        return result
    return _wrapper
1
Aaron Lelevier

J'ai frappé cette erreur parce que j'avais défini une instance Selenium.webdriver (nommée driver), appelée driver.quit() dessus, puis tenté d'appeler driver.get(url) sur le pilote arrêté. La solution consiste à ne pas appeler driver.quit().

0
duhaime

Je ne sais pas dans quelle mesure cela aidera, mais pour moi, j'essayais d'émettre une demande POST] et vous avez besoin d'une nouvelle connexion HTTP pour le faire. Vous ne pouvez pas utiliser la même connexion pour plusieurs demandes. Je continue à avoir la même erreur: httplib.BadStatusLine: ''. Je crois que la documentation décrit ceci, je l’ai simplement négligée. 

0