2009-10-09 6 views
1

une question sur l'expression régulière python.Python expression régulière pour analyser les balises div

Je voudrais correspondre à un bloc div comme

<div class="leftTail"><ul class="hotnews">any news stuff</ul></div> 

Je pensais un modèle comme

p = re.compile(r'<div\s+class=\"leftTail\">[^(div)]+</div>') 

mais il semble ne fonctionne pas correctement

un autre motif

p = re.compile(r'<div\s+class=\"leftTail\">[\W|\w]+</div>') 

J'ai beaucoup plus que ce que je pense, il obtient tous les trucs jusqu'à la dernière balise dans le fichier.

Merci pour toute aide

+0

'' correspond [^ (div)] tout caractère sauf 5 figurant entre parenthèses. Ainsi, cela ne fonctionnera pas si l'un d'eux pourrait se produire dans le contenu div. '\ W' est l'opposé de' \ w', donc '[\ W | \ w]' n'a pas de sens. Le plus simple est d'utiliser des expressions rationnelles non gourmandes comme '. +?'. Pensez à utiliser un vrai analyseur HTML si ce n'est pas la seule tâche que vous allez faire avec. –

+0

essayé. +? , semblait pas de chance ... Merci! – icn

Répondre

4

Ne pas utiliser des expressions régulières pour analyser XML ou HTML. Vous ne serez jamais capable de le faire fonctionner correctement pour les divs imbriqués.

+0

En fait, vous pouvez, mais c'est un PITA complet et il vaut mieux utiliser un analyseur X/HTML approprié. –

+0

Les expressions régulières "réelles" ne peuvent pas gérer l'imbrication. C'est ce qui sépare les langues ordinaires des langues sans contexte. La plupart des implémentations regex sont plus puissantes que strictement régulières, mais la plupart ne sont pas encore assez puissantes pour gérer l'imbrication. –

12

Vous pourriez envisager de passer à un analyseur HTML réel. Je vous suggère d'essayer Beautiful Soup. Il y a beaucoup de manières folles pour que le HTML soit formaté, et les expressions régulières peuvent ne pas fonctionner correctement tout le temps, même si vous les écrivez correctement.

+0

merci Belle soupe fonctionne très bien! – icn

4

essayez ceci:

p = re.compile(r'<div\s+class=\"leftTail\">.*?</div>') 
Questions connexes