2010-02-04 12 views
12

Chcę wyodrębnić dane między <tr> znaczników ze strony html. Użyłem następującego kodu. Ale nie uzyskałem żadnego wyniku. Html pomiędzy <tr> znaczników w wielu liniachdopasowanie wielu linii w python wyrażenie regularne

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

Proszę zaproponować rozwiązanie tego problemu.

+2

przeczytać dokumenty: http://docs.python.org/library/re.html#re.S – SilentGhost

+0

Or jeden akapit powyżej: http://docs.python.org/library/re.html#re.MULTILINE :) –

+0

@Tomasz: but ** do read ** poza nagłówkiem;) – SilentGhost

Odpowiedz

16

tylko po to, aby wyjaśnić problem. Mimo tych wszystkich linków do re.M nie działałoby to tutaj, ponieważ odsłoniłoby to proste wyjaśnienie. należałoby re.S, jeśli nie będzie próbował analizować html, oczywiście:

>>> 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) 'można również zapisać jako' re.findall (' (? S) (. *?) ', doc) '. – tzot

+0

dziękuję poprawiona naprawa –

2

Nie używaj wyrażeń regularnych do parsowania HTML. Użyj parsera HTML, takiego jak lxml lub BeautifulSoup.

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

Albo nie regex sposób

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

Nie używać wyrażenia regularnego, należy użyć parser HTML, takich jak BeautifulSoup:

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

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

Wynik:

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

Jeśli po prostu chcesz zawartość, bez t R tags:

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

Wynik:

bar 
qux 

Korzystanie parser HTML nie jest tak straszne jak to brzmi! I będzie działał bardziej niezawodnie niż jakiekolwiek regex, które zostanie zamieszczone tutaj.

0

Jako inny sugerowali konkretny problem, który masz mogą być rozwiązane przez umożliwiając dopasowanie wielo-line przy użyciu re.MULTILINE

Jednak idziesz w dół zdradzieckiego poprawki analizowania HTML with regular expressions. Zamiast tego użyj parsera XML/HTML, BeautifulSoup działa świetnie!

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