2009-03-02 6 views
3

Je veux trouver le texte entre une paire de <une> balises qui pointent vers un site donnéRecherche de texte d'ancrage quand il y a des balises, il

Voici la chaîne re que j'utilise pour trouver le contenu:

r'''(<a([^<>]*)href=("|')(http://)?(www\.)?%s([^'"]*)("|')([^<>]*)>([^<]*))</a>''' % our_url 

Le résultat sera quelque chose comme ceci:

r'''(<a([^<>]*)href=("|')(http://)?(www\.)?stackoverflow.com([^'"]*)("|')([^<>]*)>([^<]*))</a>''' 

C'est idéal pour la plupart des liens, mais il des erreurs avec un lien avec des étiquettes en son sein. J'ai essayé de changer la dernière partie de l'expression régulière de:

([^<]*))</a>''' 

à:

(.*))</a>''' 

Mais que juste obtenu tout sur la page après le lien, que je ne veux pas. Y a-t-il des suggestions sur ce que je peux faire pour résoudre ce problème?

Répondre

3

Au lieu de:

[^<>]* 

Essayez:

((?!</a).)* 

En d'autres termes, correspond à tout caractère qui n'est pas le début de une séquence </a.

+0

Merci beaucoup pour l'aide :) – Teifion

2

Je n'utiliserais pas une regex - utilisez un analyseur HTML comme Beautiful Soup.

+0

Semble un peu lourd pour un problème aussi simple – Teifion

+0

Jamais. Le HTML est très irrégulier - les navigateurs doivent tolérer un grand nombre d'erreurs. Belle soupe peut mieux traiter le HTML irrégulier que les regex peuvent. –

1

Faites une recherche non gourmande à savoir

(.*?) 
+0

Il correspond seulement jusqu'à l'étiquette dans le texte d'ancrage – Teifion

3
>>> import re 
>>> pattern = re.compile(r'<a.+href=[\'|\"](.+)[\'|\"].*?>(.+)</a>', re.IGNORECASE) 
>>> link = '<a href="http://stackoverflow.com/questions/603199/finding-anchor-text-when-there-are-tags-there">Finding anchor text when there are tags there</a>' 
>>> re.match(pattern, link).group(1) 
'http://stackoverflow.com/questions/603199/finding-anchor-text-when-there-are-tags-there' 
>>> re.match(pattern, link).group(2) 
'Finding anchor text when there are tags there' 
+0

Merci pour cela, cela m'a beaucoup aidé. –

Questions connexes