2010-06-29 32 views
0

Je suis en train d'analyser une forme html avec une belle soupe. Fondamentalement, j'ai environ 60 champs d'entrée, principalement des boutons radio et des cases à cocher. Jusqu'à présent, cela fonctionne avec le code suivant:liste associative python

from BeautifulSoup import BeautifulSoup 
x = open('myfile.html','r').read() 
out = open('outfile.csv','w') 
soup = BeautifulSoup(x) 
values = soup.findAll('input',checked="checked") 
# echoes some output like ('name',1) and ('value',4) 

for cell in values: 
# the following line is my problem! 
    statement = cell.attrs[0][1] + ';' + cell.attrs[1][1] + ';\r' 
    out.write(statement) 

out.close() 
x.close() 

En indiquant dans le code mon problème ist où les attributs sont sélectionnés, car le modèle HTML est laid, mélanger la séquence d'arguments qui appartiennent à un champ de saisie. Je suis intéressé par name = "somenumber" value = "someothernumber". Malheureusement, ma méthode attrs [1] ne fonctionne pas, car le nom et la valeur n'apparaissent pas dans la même séquence dans mon code HTML.

Existe-t-il un moyen d'accéder associativement à la liste BeautifulSoup qui en résulte?

Merci d'avance pour toute suggestion!

Répondre

2

Ma suggestion est de faire un valuesdict. Si soup.findAll retourne une liste de tuples que vous semblez dire, il est aussi simple que:

values = dict(soup.findAll('input',checked="checked")) 

Après cela, vous pouvez simplement se référer aux valeurs par leur nom d'attribut, comme ce que dit Peter.

Bien sûr, si soup.findAll ne retourne pas une liste de tuples comme vous l'avez laissé entendre, ou si votre problème est que les tuples eux-mêmes sont renvoyés d'une manière bizarre (de sorte qu'au lieu de ('name', 1) ce serait (1, 'name')), alors ça pourrait être un peu plus compliqué. D'un autre côté, si soup.findAll renvoie l'un d'un certain ensemble de types de données (dict ou liste de dicts, namedtuple ou liste de namedtuples), alors vous serez mieux car vous n'aurez pas à faire toute conversion en premier lieu.

... Oui, après avoir vérifié la documentation de BeautifulSoup, il semble que findAll retourne un objet qui peut être traité comme une liste de dicts, donc vous pouvez faire comme Peter le dit.

http://www.crummy.com/software/BeautifulSoup/documentation.html#The%20attributes%20of%20Tags

Oh oui, si vous voulez énumérer les attributs, il suffit de faire quelque chose comme ceci:

for cell in values: 
    for attribute in cell: 
     out.write(attribute + ';' + str(cell[attribute]) + ';\r') 
+0

pour moi, une boucle était suffisante .. s'il vous plaît voir mon commentaire aux réponses de Peter. –

2

Je suis assez sûr que vous pouvez utiliser le nom d'attribut comme une clé pour un hachage:

print cell['name'] 
+0

hmm ne peux pas accepter les réponses :). thx pour l'aide, fondamentalement, pour la cellule dans les valeurs: cellule ['name'] + ';' + cell ['value'] fait le travail, pas de double boucle nécessaire ici. –