2010-02-07 15 views
0

J'utilise BeautifulSoup pour analyser XML:XML avec BeautifulSoup Parsing et manipulation élément manquant

xml = """<person> 
<first_name>Matt</first_name> 
</person>""" 

soup = BeautifulStoneSoup(xml) 
first_name = soup.find('first_name').string 
last_name = soup.find('last_name').string 

Mais j'ai un problème quand il n'y a pas last_name, parce qu'il étrangle. Parfois, le flux l'a, et parfois non. Comment puis-je l'empêcher de s'étouffer? Je ne veux pas utiliser les instructions try/except. Je ne veux pas non plus utiliser les instructions if/else. (Comme il va doubler les lignes du code déjà très long si j'ai ces déclarations).

Y a-t-il un moyen de retourner simplement "None" s'il n'y a pas de "last_name"?

Répondre

4
last_name = soup.find('last_name') and soup.find('last_name').string 

très stupide, mais il ne répond à votre restriction également déclaré stupide (pas if). Un peu moins stupide:

last_name_node = soup.find('last_name') 
last_name = last_name_node and last_name_node.string 

et:

last_name = getattr(soup.find('last_name'), 'string', None) 

Ces deux n'ont pas les mêmes frais généraux que le premier. Je pense qu'un simple if est plus lisible que l'un de ceux-ci, cependant.

+0

Je préfère la version getattr de votre réponse car je crois que c'est exactement ce que getattr a été créé en premier lieu! –

+0

Lisible, mais doublerait les lignes :) merci encore alex :) – TIMEX

+0

@alex: Oh, non! Mes fichiers de code source contiennent beaucoup de caractères de saut de ligne. Que vais-je faire? –