2009-12-02 4 views
2

J'ai une virgule liste séparée dans une cellule de tableau dans un document HTML, mais certains des éléments dans la liste sont liés:diviser une liste séparée par des virgules avec des liens avec beautifulsoup

<table> 
    <tr> 
    <td>Names</td> 
    <td>Fred, John, Barry, <a href="http://www.example.com/">Roger</a>, James</td> 
    </tr> 
</table> 

J'ai utilise belle soupe pour analyser le code html, et je peux obtenir à la table, mais quelle est la meilleure façon de et revenir diviser une structure de données à peu près comme:

[ 
    {'name':'Fred'}, 
    {'name':'John'}, 
    {'name':'Barry'}, 
    {'name':'Roger', 'url':'http://www.example.com/'}, 
    {'name':'James'}, 
] 

Répondre

10

C'est une façon, vous pouvez le faire:

import BeautifulSoup 

soup = BeautifulSoup.BeautifulSoup('''<table> 
    <tr> 
    <td>Names</td> 
    <td>Fred, John, Barry, <a href="http://www.example.com/">Roger</a>, James</td> 
    </tr> 
</table>''') 

result = [] 
for tag in soup.table.findAll('td')[1]: 
    if isinstance(tag, BeautifulSoup.NavigableString): 
    for name in tag.string.split(','): 
     name = name.strip() 
     if name: 
     result.append({ 'name': name }) 
    else: 
    result.append({ 'name': tag.string.strip(), 'url': tag["href"] }) 

print result 
+0

+1 belle solution – vikingosegundo

+0

+1 c'est vraiment cool – atv

+0

Belle solution en effet! Une petite note: je remplacerais "type (balise) est BeautifulSoup.NavigableString" par "isinstance (balise, BeautifulSoup.NavigableString)". – taleinat

Questions connexes