2013-06-28 3 views
1

Je souhaite utiliser le module re pour extraire tous les nœuds html d'une chaîne, y compris tous leurs attributs. Cependant, je veux que chaque attr soit un groupe, ce qui signifie que je peux utiliser matchobj.group() pour les obtenir. Le nombre d'attr dans un noeud est flexible. C'est là que je suis confus. Je ne sais pas comment écrire une telle regex. J'ai essayé </?(\w+)(\s\w+[^>]*?)*/?>' mais pour un noeud comme <a href='aaa' style='bbb'> je peux seulement obtenir deux groupes avec [('a'), ('style="bbb")].
Je sais qu'il y a de bons parseurs HTML. Mais en réalité je ne vais pas extraire les valeurs des attrs. J'ai besoin de modifier la chaîne brute.Utilisation de regex pour extraire tous les attributs html

+1

FFS ... http://www.crummy.com/software/BeautifulSoup/ –

+0

Pensez à utiliser HTML parseurs au lieu de Regex . http://www.crummy.com/software/BeautifulSoup/ – Achrome

+0

Normal la première correspondance est écrasée par la seconde. –

Répondre

1

Description de

Pour capturer un nombre infini d'attributs, il aurait besoin d'être un processus en deux étapes, où le premier vous tirez l'élément entier. Ensuite, vous parcourez les éléments et obtenez un tableau d'attributs correspondants.

regex pour attraper tous les éléments: <\w+(?=\s|>)(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?>

enter image description here

regex pour attraper tous les attributs d'un seul élément: \s\w+=(?:'[^']*'|"[^"]*"|[^'"][^\s>]*)(?=\s|>)

enter image description here

python Exemple

Voir travaillant exemple: http://repl.it/J0t/4

code

import re 

string = """ 
<a href="i.like.kittens.com" NotRealAttribute=' true="4>2"' class=Fonzie>text</a> 
"""; 

for matchElementObj in re.finditer(r'<\w+(?=\s|>)(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?>', string, re.M|re.I|re.S): 
    print "-------" 
    print "matchElementObj.group(0) : ", matchElementObj.group(0) 

    for matchAttributesObj in re.finditer(r'\s\w+=(?:\'[^\']*\'|"[^"]*"|[^\'"][^\s>]*)(?=\s|>)', string, re.M|re.I|re.S): 
     print "matchAttributesObj.group(0) : ", matchAttributesObj.group(0) 

Sortie

------- 
matchElementObj.group(0) : <a href="i.like.kittens.com" NotRealAttribute=' true="4>2"' class=Fonzie> 
matchAttributesObj.group(0) : href="i.like.kittens.com" 
matchAttributesObj.group(0) : NotRealAttribute=' true="4>2"' 
matchAttributesObj.group(0) : class=Fonzie 
3

Please don't use regex. Utilisez BeautifulSoup:

>>> from bs4 import BeautifulSoup as BS 
>>> html = """<a href='aaa' style='bbb'>""" 
>>> soup = BS(html) 
>>> mytag = soup.find('a') 
>>> print mytag['href'] 
aaa 
>>> print mytag['style'] 
bbb 

Ou si vous voulez un dictionnaire:

>>> print mytag.attrs 
{'style': 'bbb', 'href': 'aaa'} 
+0

Je sais que les parseurs HTML devraient être de bons choix, mais en fait je ne pense pas qu'ils puissent fonctionner pour moi. J'ai besoin de modifier la chaîne brute. – zhangyangyu

+0

@zhangyangyu Jetez un oeil à [this] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#replace-with) – TerryA

+0

Peut-être que le downvoter s'il vous plaît clarifier pourquoi ils downvoted – TerryA

Questions connexes