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

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

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

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

5 Solutions collect form web for “сопоставление нескольких строк в регулярном выражении python”

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

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

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

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

Как и другие, предлагаемая конкретная проблема, с которой вы сталкиваетесь, может быть решена путем разрешения многострочного соответствия с использованием 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") 
  • Как сделать объекты Obj-C в Python?
  • Как вы разделите каждый элемент в списке на int?
  • Как перезаписать предыдущую печать на stdout в python?
  • Python - Может (или должен) изменить os.path.sep?
  • Повторная строка Python
  • Как написать на консоль в Google App Engine?
  • Использовать OAuth2 для аутентификации + совместимость с сервисом google.appengine.api.users
  • Как создать динамические поля в классе расширения Google App Engine?
  • Python - лучший язык программирования в мире.