在Python正则表达式中匹配多行
我想从一个网页的html中提取<tr>
标签之间的数据。我用了下面的代码,但没有得到任何结果。<tr>
标签之间的html内容有很多行。
category =re.findall('<tr>(.*?)</tr>',data);
请给我一些解决这个问题的建议。
5 个回答
2
不要用正则表达式来解析HTML。应该使用像 lxml 或 BeautifulSoup 这样的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)
[]