соответствие нескольких строк в регулярном выражении Python - PullRequest
12 голосов
/ 04 февраля 2010

Я хочу извлечь данные между <tr> тегами на html-странице.Я использовал следующий код. Но я не получил никакого результата.HTML-код между тегами <tr> состоит из нескольких строк

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

Пожалуйста, предложите решение этой проблемы.

Ответы [ 5 ]

16 голосов
/ 04 февраля 2010

просто чтобы прояснить проблему. Несмотря на все эти ссылки на 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)
[]
5 голосов
/ 04 февраля 2010

Не используйте регулярные выражения, используйте 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")

Результат:

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

Если вы просто хотите содержимое без тегов tr:

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

Результат:

bar
qux

Использование анализатора HTML не так страшно, как кажется! И это будет работать более надежно, чем любое регулярное выражение, которое будет опубликовано здесь.

2 голосов
/ 04 февраля 2010
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>"):]
2 голосов
/ 04 февраля 2010

Не используйте регулярные выражения для разбора HTML.Используйте анализатор HTML, например lxml или BeautifulSoup .

0 голосов
/ 04 февраля 2010

Как и предполагали другие, конкретную проблему, с которой вы столкнулись, можно решить с помощью , разрешив многострочное сопоставление, используя re.MULTILINE

Однако вы идете по пути коварного разбора патча HTML с регулярными выражениями . Вместо этого используйте парсер 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...