在python正则表达式中匹配多行

时间:2010-02-04 12:22:43

标签: python

我想从html页面中的<tr>标签之间提取数据。我使用了以下代码。但我没有得到任何结果。 <tr>标记之间的html是多行

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

请建议解决此问题。

5 个答案:

答案 0 :(得分:16)

只是为了解决这个问题。尽管与re.M有所有这些链接,但它在这里不起作用,因为它的解释会简单地略读。如果你不想尝试解析html,你需要re.S

>>> 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 :(得分:5)

请勿使用正则表达式,请使用BeautifulSoup之类的HTML解析器:

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

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

结果:

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

如果你只想要内容,不带tr标签:

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

结果:

bar
qux

使用HTML解析器并不像听起来那么可怕!并且它将比将在此处发布的任何正则表达式更可靠地工作。

答案 2 :(得分:2)

不要使用正则表达式来解析HTML。使用HTML解析器,例如lxmlBeautifulSoup

答案 3 :(得分:2)

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

或非正则表达方式,

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

答案 4 :(得分:0)

正如其他人所说,您可以通过允许使用re.MULTILINE进行多行匹配来解决您遇到的具体问题

然而你正在解决一个解析HTML with regular expressions 的危险补丁。使用XML / HTML解析器,BeautifulSoup非常适用于此!

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