Vérification pour les attributs de BeautifulSoup?
Je suis d'analyse des données à partir d'HTML en marchant à travers des éléments à un certain niveau à l'aide de nextSibling, et de faire des choses différentes en fonction de l'étiquette le nom et la classe de chaque élément rencontré.
par exemple,
if n.name == "p" and n.class == "poem": blah()
Mais cela soulève une erreur si l'élément n'a pas de classe ou si elle n'est pas une instance de Balise et donc n'a pas de nom.
Tests avant d'accéder comme ce
if "name" in n:
retourne toujours false. J'ai pu vérifier le type de l'objet renvoyé par nextSibling pour essayer d'éliminer NavigableString et de Commentaires, mais il doit y avoir un moyen plus facile.
MODIFIER
Envoyé le dev de BeautifulSoup avec cette question et il a recommandé de tester avec
n.get("class")
qui renvoie None si la "classe" n'est pas définie, ce qui permet de faire:
if n.get("class") == "poem": blah()
OriginalL'auteur blocks | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Outre l'utilisation de
get()
méthodeUne autre option est d'utiliser
has_attr()
(utiliserhas_key()
pré BeautifulSoup 4):n.has_key()
a été désapprouvée etn.has_attr("class")
est préféréOriginalL'auteur Jasper van den Bosch
Dans ce cas, des exceptions peuvent être votre ami:
Vous pouvez également envelopper dans un
except
si c'est le cas:OriginalL'auteur Michał Bentkowski
Essayer ce~:
if class in n.attrs
n.attrs
est une liste de tuples comme ceci:[(u'class', u'my-class'), (u'id', u'my-id')]
. Vous devez activer la liste dans undict
premier.OriginalL'auteur CDT
Pourquoi pas?
hasattr(n, la"classe") == true implique n.class il existe, non pas n [classe]
Le référencement "n.class" yeilds "Erreur de Syntaxe" (je crois parce que la "classe" est un mot-clé")? "hasattr(n, la "classe") est également de me donner des faux positifs, donc plus d'Erreurs de Clé.
Lire la beautifulsoup docs, ils décrivent les options pour traiter avec des balises attributs qui sont en conflit avec python mots réservés. Mais votre problème fondamental est que vous êtes confus attribut accéder par exemple x.y avec accès à l'élément x[y]. Ils ne sont pas la même chose en python.
J'ai été frapper ma tête contre le BeautifulSoup docs, et je ne vois pas la réponse à ma question. Ils répondent à l'aide de l'attribut dictionnaire pour les attributs qui sont en conflit avec python mots-clés, mais seulement dans le contexte de la recherche. Je ne suis pas à la recherche - j'ai un élément et je suis juste essayer pour voir si elle a une classe. n["classe"] réussit à accéder à la classe quand il existe, mais je suis toujours à la recherche pour le check - hasattr(n, la "classe") ne fonctionne pas.
OriginalL'auteur abeyer