2013-07-20 16 views
8

Ecco il codice che ho:Come faccio a garantire che re.findall() si fermi nel posto giusto?

a='<title>aaa</title><title>aaa2</title><title>aaa3</title>' 
import re 
re.findall(r'<(title)>(.*)<(/title)>', a) 

Il risultato è:

[('title', 'aaa</title><title>aaa2</title><title>aaa3', '/title')] 

Se ho mai progettato un crawler per farmi titoli dei siti web, che potrebbe finire con qualcosa di simile a questo piuttosto di un titolo per il sito web.

La mia domanda è, come posso limitare findall a un singolo <title></title>?

+9

È possibile utilizzare BeautifulSoup per analizzare HTML invece di Regex – Achrome

+3

http://stackoverflow.com/a/1732454/193892 –

risposta

2
re.findall(r'<(title)>(.*?)<(/title)>', a) 

Aggiungi un ? dopo la *, quindi sarà non avidi.

13

Uso re.search invece di re.findall se desideri solo una partita:

>>> s = '<title>aaa</title><title>aaa2</title><title>aaa3</title>' 
>>> import re 
>>> re.search('<title>(.*?)</title>', s).group(1) 
'aaa' 

Se si voleva tutti i tag, allora si dovrebbe pensare di cambiare per essere non-avido (vale a dire - .*?):

print re.findall(r'<title>(.*?)</title>', s) 
# ['aaa', 'aaa2', 'aaa3']  

Ma davvero considerare l'utilizzo di BeautifulSoup o lxml o simili per analizzare HTML.

+3

E 'vero che l'utilizzo di regexen per analizzare HTML o XML di solito è una cattiva idea. –

Problemi correlati