2011-01-10 3 views
0

J'ai ce code:Python: HTML regex ne correspond pas à

reg = re.search('<div class="col result_name">(.*)</div>', html) 
print 'Value is', reg.group() 

Où 'html' contient quelque chose comme ceci:

 <div class="col result_name"> 
      <h4>Blah</h4> 
      <p> 
       blah 
      </p> 
     </div> 

Mais il ne rien retourner.

Value is 
Traceback (most recent call last): 
    File "run.py", line 37, in <module> 
    print 'Value is', reg.group() 
+4

... et voilà pourquoi vous ne devriez pas * * 'parse' HTML avec regex. – user225312

+0

[Lire ceci] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) puis utilisez les outils appropriés pour analyser html. –

+3

@A A: non ce n'est pas le cas.

est. –

Répondre

6

N'utilisez pas regex pour analyser html. Utilisez un analyseur html

import lxml.html 
doc = lxml.html.fromstring(your_html) 
result = doc.xpath("//div[@class='col result_name']") 
print result 

lien obligatoire:

RegEx match open tags except XHTML self-contained tags

+0

Je reçois des résultats comme ceci: [, Zeno

+0

@Zeno: Oui, ce sont tous les divs lxml trouvé dans votre code HTML. Les éléments. Vous pouvez les imprimer ou faire d'autres analyses avec eux. Par exemple, essayez ceci: 'pour onediv dans le résultat: print lxml.html.tostring (onediv, pretty_print = True)' – nosklo

+0

Est-ce que xpath supporte regex? Je veux faire quelque chose comme (col | row) là-dedans. – Zeno

3

Le point ne correspond pas à neccessarily nouvelles lignes REs, vous avez besoin du DOTALL drapeau (?s) pour cela.

2

http://docs.python.org/library/re.html:

Les caractères spéciaux sont:

'' (point.) Dans le mode par défaut, cela correspond à tout caractère à l'exception d'une nouvelle ligne. Si le drapeau DOTALL a été spécifié, ceci correspond à n'importe quel caractère incluant une nouvelle ligne.