2010-05-24 8 views
1

A partir d'une entrée Html comme ceci:Comment trouver des liens et modifier un fichier HTML en utilisant BeautifulSoup en Python

<p> 
<a href="http://www.foo.com">this if foo</a> 
<a href="http://www.bar.com">this if bar</a> 
</p> 

utilisant BeautifulSoup, je voudrais changer cette Html dans:

<p> 
<a href="http://www.foo.com">this if foo[1]</a> 
<a href="http://www.bar.com">this if bar[2]</a> 
</p> 

sauver liens analysable dans un dictionnaire avec un résultat comme celui-ci:

links_dict = {"1":"http://www.foo.com","2":"http://www.bar.com"} 

Est-il possible de le faire en utilisant BeautifulSoup? Toute alternative valide?

Répondre

4

Cela devrait être facile dans Beautiful Soup.

Quelque chose comme:

from BeautifulSoup import BeautifulSoup 
from BeautifulSoup import Tag 

count = 1 
links_dict = {} 
soup = BeautifulSoup(text) 
for link_tag in soup.findAll('a'): 
  if link_tag['href'] and len(link_tag['href']) > 0: 
    links_dict[count]  = link_tag['href']   
    newTag = Tag(soup, "a", link_tag.attrs) 
    newTag.insert(0, ''.join([''.join(link_tag.contents), "[%s]" % str(count)])) 
    link_tag.replaceWith(newTag) 
    count += 1 

Résultat d'exécution sur ce texte:

>>> soup 
<p> 
    <a href="http://www.foo.com">this if foo[1]</a> 
    <a href="http://www.bar.com">this if bar[2]</a> 
</p> 

>>> links_dict 
{1: u'http://www.foo.com', 2: u'http://www.bar.com'} 

Le seul problème que je peux prévoir avec cette solution est si votre texte de lien contient subtags; alors vous ne pouviez pas faire ''.join(link_tag.contents); à la place, vous devrez naviguer vers l'élément de texte le plus à droite.

+0

@danben +1 pour l'effort. En fait, c'est comme le code que j'ai fait avant de poser la question. Cela ne fonctionne pas parce que vous vous retrouvez avec quelque chose comme this if foo et ce n'est pas ce que je veux. – systempuntoout

+0

@systempuntoout: édité; le code actuel fonctionne pour moi. – danben

+0

@danben pensez-vous qu'il est possible de changer le contenu du nœud sans recréer un nouveau tag? – systempuntoout

Questions connexes