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

13 投票
5 回答
15196 浏览
提问于 2025-04-15 18:53

我想从一个网页的html中提取<tr>标签之间的数据。我用了下面的代码,但没有得到任何结果。<tr>标签之间的html内容有很多行。

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

请给我一些解决这个问题的建议。

5 个回答

2

不要用正则表达式来解析HTML。应该使用像 lxmlBeautifulSoup 这样的HTML解析器。

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>]

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

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

结果:

bar
qux

使用HTML解析器其实并没有听起来那么可怕!而且它的效果比这里提到的任何正则表达式都要可靠。

18

为了澄清这个问题。尽管有很多关于 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)
[]

撰写回答