2009-10-16 6 views
4

Je cherche un moyen de remplacer l'attribut SRC dans toutes les balises IMG n'utilisant pas d'expressions régulières. (Aimeriez-vous utiliser un out-of-the analyseur zone HTML inclus avec l'installation Python par défaut) je dois réduire la source de ce que jamais il peut être à:Remplacer SRC de tous les éléments IMG en utilisant Parser

<img src="cid:imagename"> 

Je suis en train de remplacer toutes les balises src à pointez sur le cid d'une pièce jointe pour un e-mail HTML, donc je devrai également changer quelle que soit la source, donc c'est simplement le nom du fichier sans le chemin ou l'extension.

+1

Je recommande lxml pour cela, mais puisque vous dit explicitement qu'il doit être inclus avec Python, il est un commentaire, pas une réponse. ;) –

+0

Merci. Je ne vais pas exclure cela d'autres solutions et apprécier la suggestion! – CPCase

Répondre

18

Il existe un analyseur HTML dans la bibliothèque standard Python, mais ce n'est pas très utile et il est obsolète depuis Python 2.6. Faire ce genre de choses avec BeautifulSoup est vraiment facile:

from BeautifulSoup import BeautifulSoup 
from os.path import basename, splitext 
soup = BeautifulSoup(my_html_string) 
for img in soup.findAll('img'): 
    img['src'] = 'cid:' + splitext(basename(img['src']))[0] 
my_html_string = str(soup) 
+0

Merci pour cet exemple. Je l'apprécie grandement! – CPCase

+2

le HTMLParser dans le stdlib n'est pas obsolète? D'où vient-il? voici les docs de la version python 3: http://docs.python.org/3/library/html.parser.html – simon

1

Voici une approche pyparsing à votre problème. Vous devrez faire votre propre code pour transformer l'attribut http src.

from pyparsing import * 
import urllib2 

imgtag = makeHTMLTags("img")[0] 

page = urllib2.urlopen("http://www.yahoo.com") 
html = page.read() 
page.close() 

# print html 

def modifySrcRef(tokens): 
    ret = "<img" 
    for k,i in tokens.items(): 
     if k in ("startImg","empty"): continue 
     if k.lower() == "src": 
      # or do whatever with this 
      i = i.upper() 
     ret += ' %s="%s"' % (k,i) 
    return ret + " />" 

imgtag.setParseAction(modifySrcRef) 

print imgtag.transformString(html) 

Les balises convertissent à:

<img src="HTTP://L.YIMG.COM/A/I/WW/BETA/Y3.GIF" title="Yahoo" height="44" width="232" alt="Yahoo!" /> 
<a href="r/xy"><img src="HTTP://L.YIMG.COM/A/I/WW/TBL/ALLYS.GIF" height="20" width="138" alt="All Yahoo! Services" border="0" /></a> 
+0

Merci beaucoup pour ça. Je vais l'essayer. J'apprécie votre temps et votre aide! – CPCase

Questions connexes