9
votes

Python Regex Look-derrière nécessite un motif de largeur fixe

Lorsque vous essayez d'extraire le titre d'une page HTML, j'ai toujours utilisé la regex suivante: xxx pré>

qui extraire tout entre les balises dans un document et ignorera les étiquettes elles-mêmes. Cependant, lorsque vous essayez d'utiliser cette regex dans Python, il soulève l'exception suivante: p> xxx pré>

Le code que j'utilise est le suivant: P>

pattern = re.compile('(?<=<title>)([\s\S]*)(?=</title>)')
m = pattern.search(f)


2 commentaires

Existe-t-il une raison pour être une affirmation de largeur zéro? Pourriez-vous simplement utiliser un groupe de non-capture?


Bien que vous ne devriez pas utiliser des expressions régulières pour traiter HTML. Pourquoi utilisez-vous des regards du tout et non quelque chose comme ([\ S \ s] *) et prenez le match du premier groupe?


5 Réponses :


12
votes

Mélanger l'idée d'analyser HTML avec des expressions régulières et utilisez plutôt une bibliothèque d'analyse HTML. Après une recherche rapide, j'ai trouvé Celui-ci . C'est un moyen beaucoup plus sûr d'extraire des informations à partir d'un fichier HTML.

N'oubliez pas que HTML n'est pas une langue régulière afin que les expressions régulières sont fondamentalement le mauvais outil pour extraire des informations de celui-ci.


1 commentaires

Beautifulsoup ( CreMamy.com/software/Beautiful ) est également une bonne option.




2
votes

Si vous voulez simplement obtenir la balise de titre,

html=urllib2.urlopen("http://somewhere").read()
for item in html.split("</title>"):
    if "<title>" in item:
        print item[ item.find("<title>")+7: ]


0 commentaires

3
votes

Qu'en est-il de quelque chose comme: xxx


0 commentaires

4
votes

La regex pour extraire le contenu des balises HTML / XML non imbriquées est en fait très simple: xxx

Cependant, pour quelque chose de plus complexe, vous devriez vraiment utiliser un analyseur DOM approprié comme Urllib ou beauxoup.


0 commentaires