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

Sre*_*ran 13 python

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

category =re.findall('<tr>(.*?)</tr>',data);
Run Code Online (Sandbox Code Playgroud)

请建议修复此问题.

Sil*_*ost 17

只是为了解决这个问题.尽管所有这些链接在re.M这里都不起作用,因为简单的略读其解释会揭示.你需要re.S,如果你不想尝试解析html,当然:

>>> 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)
[]
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

不要使用正则表达式,使用HTML解析器,如BeautifulSoup:

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

import BeautifulSoup
soup = BeautifulSoup.BeautifulSoup(html)
print soup.findAll("tr")
Run Code Online (Sandbox Code Playgroud)

结果:

[<tr>bar</tr>, <tr>qux</tr>]
Run Code Online (Sandbox Code Playgroud)

如果你只想要内容,没有tr标签:

for tr in soup.findAll("tr"):
    print tr.contents
Run Code Online (Sandbox Code Playgroud)

结果:

bar
qux
Run Code Online (Sandbox Code Playgroud)

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