En passant de données web dans Belle Soupe - liste Vide
J'ai revérifié mon code et regardé des exploitations comparables sur l'ouverture d'une URL pour transmettre des données du web dans la Belle Soupe, pour une raison quelconque, mon code ne retourne rien, même si c'est sous une forme correcte:
>>> from bs4 import BeautifulSoup
>>> from urllib3 import poolmanager
>>> connectBuilder = poolmanager.PoolManager()
>>> content = connectBuilder.urlopen('GET', 'http://www.crummy.com/software/BeautifulSoup/')
>>> content
<urllib3.response.HTTPResponse object at 0x00000000032EC390>
>>> soup = BeautifulSoup(content)
>>> soup.title
>>> soup.title.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'name'
>>> soup.p
>>> soup.get_text()
''
>>> content.data
a stream of data follows...
Comme indiqué, il est clair que urlopen() retourne une réponse HTTP qui est capturée par le contenu des variables, il est logique qu'elle peut lire l'état de la réponse, mais après c'est passé dans la Belle Soupe, le web de données n'est pas converti dans une Belle Soupe à l'objet (variable soupe). Vous pouvez voir que j'ai essayé de lire un peu les balises et le texte, le get_text() retourne une liste vide, ce qui est étrange.
Étrangement, quand j'ai accès au web de données par l'intermédiaire de contenu.de données, les données de la montre, mais il n'est pas utile puisque je ne peux pas utiliser de Belles Soupe à l'analyser. Quel est mon problème? Merci.
BeautifulSoup
objet—dans le cas contraire, soup.title
aurait soulevé une exception plutôt que de vous donner None
. Une meilleure façon de le savoir est d'imprimer type(soup)
.votre code est de ne rien obtenir, essayez d'imprimer le contenu.lire()
Est-il une raison pour laquelle vous êtes manuellement la construction d'une piscine et d'appeler ensuite de "le plus bas niveau d'appel pour faire une demande" sur?
Je vois, merci.
contenu.read() donne b"
OriginalL'auteur user3885774 | 2014-07-31
Vous devez vous connecter pour publier un commentaire.
Si vous voulez juste pour gratter la page,
requests
obtiendrez le contenu dont vous avez besoin:OriginalL'auteur Padraic Cunningham
urllib3 retourne un objet Response, qui contient le
.data
qui a préchargé corps de la charge utile.Par le sommet de démarrage rapide exemple d'utilisation ici, je voudrais faire quelque chose comme ceci:
Le reste devrait fonctionner comme prévu.
--
Un peu plus sur ce qui s'est passé dans votre code original:
Vous avez passé toute la
response
objet plutôt que le corps de la charge utile. Cela devrait normalement être bien parce que leresponse
objet est un fichier-comme l'objet, sauf dans ce cas urllib3 consomme déjà tous la réponse et l'analyse pour vous, de sorte qu'il n'y a rien à.read()
. C'est comme le passage d'un filepointer qui a déjà été lu..data
de l'autre coté, l'accès est déjà lire les données.Si vous souhaitez utiliser urllib3 réponse objets sous forme de fichier-comme des objets, vous aurez besoin de désactiver le préchargement, comme ceci:
Maintenant, il devrait fonctionner comme prévu.
Je comprends que ce n'est pas très évident de comportement, et que l'auteur de urllib3 je m'en excuse. 🙂 Nous avons l'intention de faire
preload_content=False
par défaut un jour. Peut-être un jour bientôt (J'ai ouvert un sujet ici).--
Une note rapide sur les
.urlopen
vs.request
:.urlopen
suppose que vous allez prendre soin de l'encodage des paramètres passés à la demande. Dans ce cas, il est bien d'utiliser.urlopen
parce que vous n'êtes pas passer des paramètres à la demande, mais en général.request
fera tout le travail pour vous donc c'est plus pratique.Si quelqu'un serait en place pour améliorer notre documentation à cet effet, que serait grandement apprécié. 🙂 Merci d'envoyer un PR de https://github.com/shazow/urllib3 et ajouter vous-même en tant que contributeur!
Pas de soucis, votre expérience est une information utile pour moi. 🙂
OriginalL'auteur shazow
Ce que vous avez appelé
content
n'est pas le contenu, mais un fichier-comme l'objet que vous pouvez lire le contenu. BeautifulSoup est parfaitement heureux de faire une telle chose, mais ce n'est pas très utile d'imprimer à des fins de débogage. Donc, nous allons réellement lire le contenu afin de rendre cela plus facile à déboguer:Cela devrait rendre assez clair que
BeautifulSoup
n'est pas le problème ici. Mais en continuant sur:Oui, il le fait. Le fait que
soup.title
vous a donnéNone
au lieu de lever uneAttributeError
est assez bonne preuve, mais vous pouvez le tester directement:C'est certainement une
BeautifulSoup
objet.Lorsque vous passez
BeautifulSoup
une chaîne vide, exactement ce que vous obtenez de retour dépendra de l'analyseur c'est à l'aide de sous les couvertures; si elle s'appuie sur le Python 3.x stdlib, ce que vous obtiendrez est unhtml
nœud avec un videhead
, et videbody
, et rien d'autre. Ainsi, lorsque vous recherchez untitle
nœud, il n'existe pas, et vous obtenezNone
.Alors, comment vous résoudre ce problème?
Comme la documentation dit, vous êtes à l'aide de "le plus bas niveau d'appel pour faire une demande, donc vous aurez besoin de spécifier tous les crus de détails." Ce sont ces premières détails? Honnêtement, si vous ne la connaissez pas déjà, vous ne devriez pas être en utilisant cette méthode, vous Enseigner la façon de traiter avec les sous-le-capot détails de
urllib3
avant même de connaître les règles de base ne serait pas en train de faire un service.En fait, vous n'avez pas vraiment besoin
urllib3
ici à tous. Suffit d'utiliser les modules qui viennent avec Python:C'est ce que mon dernier paragraphe explique: vous pouvez avoir un vide de la soupe, ou une soupe avec juste un
html
nœud avec un videhead
etbody
, mais il n'a vraiment pas d'importance; il n'y a pas de données utiles, alors qui s'en soucie exactement la manière dont l'absence de données utiles est représenté?urllib3 retourne en fait un fichier-aimé objet, mais il est consommé par défaut (ce n'est pas l'idéal, comme je l'ai mentionné dans ma réponse ci-dessous et ouvert un problème). Pour corriger cela, utiliser preload_content=False dans le paramètre de la requête.
Ou, plus simplement, il suffit d'utiliser
r.data
, qui est l'endroit où le contenu préchargé va. Ou, plus simplement encore, ne pas utiliser deurllib3
si vous n'en avez pas besoin et c'est trop compliqué pour vous de trouver ce dont vous avez besoin dans les docs...Ou de donner à l'auteur de urllib3 de la rétroaction sur la façon de faire ce pas trop compliqué de sorte qu'il peut fixer. 🙂 Ou encore plus préféré, venez nous aider à l'améliorer!
OriginalL'auteur abarnert
Ma belle soupe code a été de travailler dans un environnement (ma machine locale) et au retour d'une liste vide dans un autre (ubuntu 14 serveur).
J'ai résolu mon problème en changeant l'installation.
les détails dans l'autre thread:
Analyse Html avec une Belle Soupe retourne la liste vide
OriginalL'auteur Roger Camargo