2010-02-04 14 views
12

Ich möchte die Daten zwischen <tr> Tags aus einer HTML-Seite extrahieren. Ich habe den folgenden Code benutzt. Aber ich habe kein Ergebnis bekommen. Die html zwischen den <tr>-Tags in mehreren Zeilenübereinstimmende mehrere Zeile in regulären Python-Ausdruck

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

Bitte ein Update für dieses Problem vor.

+2

die Dokumentation lesen: http://docs.python.org/library/re.html#re.S – SilentGhost

+0

Or ein Absatz oben: http://docs.python.org/library/re.html#re.MULTILINE :) –

+0

@Tomasz: aber ** lese ** über den Header hinaus;) – SilentGhost

Antwort

16

nur um das Problem zu klären. Trotz all dieser Links zu re.M würde es hier nicht funktionieren, da das einfache Abschöpfen der Erklärung aufdecken würde. Sie würden re.S benötigen, wenn Sie nicht HTML zu analysieren versuchen würde, natürlich:

>>> 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) 'kann auch als' re.findall (' (? S) (. *?) ', doc) 'geschrieben werden. – tzot

+0

danke der re.S Fix funktioniert –

2

Verwenden Sie keine regulären Ausdrücke, um HTML zu analysieren. Verwenden Sie einen HTML-Parser wie lxml oder BeautifulSoup.

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

oder nicht regex Weise

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

Verwenden regex nicht, einen HTML-Parser verwenden, wie BeautifulSoup:

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

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

Ergebnis:

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

Wenn Sie wollen nur den Inhalt, ohne das t r tags:

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

Ergebnis:

bar 
qux 

Mit Hilfe eines HTML-Parser ist nicht so gefährlich, wie es klingt! Und es wird zuverlässiger funktionieren als jeder Regex, der hier veröffentlicht wird.

0

Wie andere haben das spezifische Problem vorgeschlagen, dass Sie re.MULTILINEHTML with regular expressions von ermöglicht eine tückische Patch Parsing

jedoch Sie gehen nach unten mit mehreren Leitungen Anpassung gelöst werden haben können. Verwenden Sie stattdessen einen XML/HTML-Parser, BeautifulSoup funktioniert gut dafür!

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