2009-05-11 7 views
6

Si consideri il seguente:Python - Regex - Come trovare una corda tra due insiemi di stringhe

<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 

Come si va di prendere la linea sitemap con espressioni regolari in pitone?

<a href="/sitemap">Sitemap</a> 

Di seguito può essere utilizzato per tirare fuori i tag di ancoraggio.

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

Tuttavia, ci sono più tag di ancoraggio. Inoltre ci sono più hotlink (s) quindi non possiamo davvero usarli?

+0

Si avrà probabilmente sentire che le espressioni regolari non sono adatti per l'analisi di un contesto di libera linguaggio come HTML. – Gumbo

+2

Se sei quello che genera quell'HTML, vale la pena notare che molti attributi identici 'id =' non sono validi. Un 'class =' è più appropriato. –

risposta

13

Non utilizzare un'espressione regolare. Utilizzare BeautfulSoup, un parser HTML.

from BeautifulSoup import BeautifulSoup 

html = \ 
""" 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div>""" 

soup = BeautifulSoup(html) 
soup.findAll("div",id="hotlink")[2].a 

# <a href="/sitemap">Sitemap</a> 
6

L'analisi di HTML con espressioni regolari è una cattiva idea!

Pensate il seguente pezzo di codice HTML

Ci sono molti altri esempi. Le espressioni regolari sono buone per molte cose, ma non per l'analisi dell'HTML.

è consigliabile utilizzare Beautiful Soup python parser HTML.

In ogni caso, una soluzione ad-hoc utilizzando regex è

import re 

data = """ 
<div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
    <div id=hotlink> 
    <a href="/">Home</a> 
    </div> 
    <div id=hotlink> 
    <a href="/extract">Extract</a> 
    </div> 
    <div id=hotlink> 
    <a href="/sitemap">Sitemap</a> 
    </div> 
</div> 
""" 

e = re.compile('<a *[^>]*>.*</a *>') 

print e.findall(data) 

uscita:

>>> e.findall(data) 
['<a href="foo1.com">Foo1</a>', '<a href="/">Home</a>', '<a href="/extract">Extract</a>', '<a href="/sitemap">Sitemap</a>'] 
+0

Se si sostituisce '. *' Con '(?: [^ <] + | <(!/A \ b)) *', si ottengono meno falsi positivi, senza far esplodere il motore regex con il backtracking. –

1

Usa BeautifulSoup o lxml se è necessario analizzare HTML.

Inoltre, che cosa è che si ha realmente bisogno di fare? Trova l'ultimo link? Trova il terzo link? Trova il link che punta a/sitemap? Non è chiaro dalla tua domanda. Che cosa è necessario per fare con i dati?

Se davvero si deve usare le espressioni regolari, uno sguardo ai findall.

5

Al fine di estrarre il contenuto del motto:

<a href="/sitemap">Sitemap</a> 

... vorrei usare:

>>> import re 
    >>> s = ''' 
    <div id=hotlinklist> 
    <a href="foo1.com">Foo1</a> 
     <div id=hotlink> 
     <a href="/">Home</a> 
     </div> 
     <div id=hotlink> 
     <a href="/extract">Extract</a> 
     </div> 
     <div id=hotlink> 
     <a href="/sitemap">Sitemap</a> 
     </div> 
    </div>''' 
    >>> m = re.compile(r'<a href="/sitemap">(.*?)</a>').search(s) 
    >>> m.group(1) 
    'Sitemap' 
+0

In realtà, sostituisci la Sitemap con XYZ perché può essere qualsiasi cosa. Saprei solo che è il terzo div all'interno del div hotlinlist. Il modello html utilizzato può essere ripetuto più volte. Diciamo che voglio eliminare tutti gli elenchi di smart phone su ebay. Vorrei sapere che lo schema sopra è ripetuto per ogni smartphone trovato, tuttavia, il XYZ può essere un iphone, blackberry, Nokia o qualsiasi altro smart phone. Non potrebbe esserci nessun oggetto o 100s. Quindi, stavo cercando qualcosa che dice trovare il modello ripetuto, quindi prendere la linea smart phone e avere un elenco di smart phone. – un33k

+0

Mi piace perché risponde alla domanda. Mi ha anche aiutato a capire meglio l'espressione regolare, che ci crediate o meno. – Max

Problemi correlati