2010-02-04 13 views
12

Voglio estrarre i dati tra i tag <tr> da una pagina html. Ho usato il seguente codice. Ma non ho ottenuto alcun risultato. Il codice HTML tra i tag <tr> è su più righecorrispondenza di più righe nell'espressione regolare python

category =re.findall('<tr>(.*?)</tr>',data); 

Si prega di suggerire una correzione per questo problema.

+2

leggere la documentazione: http://docs.python.org/library/re.html#re.S – SilentGhost

+0

O un paragrafo sopra: http://docs.python.org/library/re.html#re.MULTILINE :) –

+0

@Tomasz: ma ** leggere ** oltre l'intestazione;) – SilentGhost

risposta

16

solo per chiarire il problema. Nonostante tutti quei link a re.M, non funzionerebbe qui come rivelerebbe una semplice scrematura della sua spiegazione. Avreste bisogno re.S, se non si tenta di analizzare HTML, naturalmente:

>>> doc = """<table border="1"> 
    <tr> 
     <td>row 1, cell 1</td> 
     <td>row 1, cell 2</td> 
    </tr> 
    <tr> 
     <td>row 2, cell 1</td> 
     <td>row 2, cell 2</td> 
    </tr> 
</table>""" 

>>> re.findall('<tr>(.*?)</tr>', doc, re.S) 
['\n  <td>row 1, cell 1</td>\n  <td>row 1, cell 2</td>\n ', 
'\n  <td>row 2, cell 1</td>\n  <td>row 2, cell 2</td>\n '] 
>>> re.findall('<tr>(.*?)</tr>', doc, re.M) 
[] 
+1

're.findall (' (' . *?) ', doc, re.S) 'può anche essere scritto come' re.findall (' (? S) (. *?) ', doc) '. – tzot

+0

grazie alla correzione di reS lavorata –

2

Non utilizzare espressioni regolari per analizzare HTML. Utilizzare un parser HTML come lxml o BeautifulSoup.

2
pat=re.compile('<tr>(.*?)</tr>',re.DOTALL|re.M) 
print pat.findall(data) 

O modo non regex,

for item in data.split("</tr>"): 
    if "<tr>" in item: 
     print item[item.find("<tr>")+len("<tr>"):] 
5

Non utilizzare regex, utilizzare un parser HTML come BeautifulSoup:

html = '<html><body>foo<tr>bar</tr>baz<tr>qux</tr></body></html>' 

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(html) 
print soup.findAll("tr") 

Risultato:

[<tr>bar</tr>, <tr>qux</tr>] 

Se vuoi solo il contenuto, senza il t r tags:

for tr in soup.findAll("tr"): 
    print tr.contents 

risultati:

bar 
qux 

L'utilizzo di un parser HTML non è così spaventoso come sembra! E funzionerà in modo più affidabile rispetto a qualsiasi regex che verrà pubblicata qui.

0

Come altri hanno suggerito il problema specifico che si stanno avendo può essere risolto da consentendo corrispondenza multi-line utilizzando re.MULTILINE

Tuttavia si sta andando verso il basso di una patch di analisi insidioso HTML with regular expressions. Usa invece un parser XML/HTML, BeautifulSoup funziona alla grande per questo!

doc = """<table border="1"> 
    <tr> 
     <td>row 1, cell 1</td> 
     <td>row 1, cell 2</td> 
    </tr> 
    <tr> 
     <td>row 2, cell 1</td> 
     <td>row 2, cell 2</td> 
    </tr> 
</table>""" 

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(doc) 
all_trs = soup.findAll("tr") 
Problemi correlati