2010-02-04 15 views
12

Quiero extraer los datos entre <tr> etiquetas de una página html. Usé el siguiente código. Pero no obtuve ningún resultado. El HTML entre las etiquetas <tr> está en múltiples líneascoincidencia de varias líneas en la expresión regular de python

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

Para sugerir una solución para este problema.

+2

leer los documentos: http://docs.python.org/library/re.html#re.S – SilentGhost

+0

O un párrafo arriba: http://docs.python.org/library/re.html#re.MULTILINE :) –

+0

@Tomasz: pero ** lee ** más allá del encabezado;) – SilentGhost

Respuesta

16

para resolver el problema. A pesar de todos esos enlaces a re.M no funcionaría aquí como lo revelaría un simple desnatado de su explicación. Se necesitaría re.S, si no se trataría de analizar HTML, por supuesto:

>>> 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) 'también se pueden escribir como' re.findall (' (? S) (. *?) ', doc) '. – tzot

+0

gracias al arreglo re.S trabajado –

2

No utilice expresiones regulares para analizar HTML. Use un analizador HTML como lxml o BeautifulSoup.

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

O manera no regulares,

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

No utilice expresiones regulares, utilizar un analizador de HTML como BeautifulSoup:

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

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

Resultado:

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

Si solo quieres los contenidos, sin la t r etiquetas:

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

Resultados:

bar 
qux 

El uso de un analizador de HTML no es tan difícil como suena! Y funcionará de manera más confiable que cualquier expresión regular que se publicará aquí.

0

Como otros han sugerido que el problema específico que está teniendo puede ser resuelta por permitiendo coincidencia de varias líneas utilizando re.MULTILINE

Sin embargo que van abajo de un análisis de parches traicionero HTML with regular expressions. Utilice un analizador XML/HTML en su lugar, BeautifulSoup ¡funciona muy bien para esto!

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") 
Cuestiones relacionadas