Сопоставление нескольких строк в регулярном выражении python
Я хочу извлечь данные между тегами <tr>
с html-страницы. Я использовал следующий код. Но я не получил никакого результата. Html между тегами <tr>
находится в нескольких строках
category =re.findall('<tr>(.*?)</tr>',data);
Пожалуйста, предложите исправить эту проблему.
Ответы
Ответ 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")