Подтвердить что ты не робот

Сопоставление нескольких строк в регулярном выражении python

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

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

Пожалуйста, предложите исправить эту проблему.

4b9b3361

Ответ 1

просто для устранения проблемы. Несмотря на все эти ссылки на 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)
[]

Ответ 2

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

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

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

Результат:

bar
qux

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

Ответ 3

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

Ответ 4

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

Ответ 5

Как и другие, предлагаемая конкретная проблема, которую вы испытываете, может быть решена с помощью , позволяющей многострочное сопоставление с использованием 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")