Форум сайта python.su
Здравствуйте.
Есть некий кусок html кода в одну строчку.
<tr bgcolor=ffffff><td>> Текст1</td><td><b>12.22</td></tr><tr bgcolor=EEF4FA><td>> Текст2</td><td><b>12.10</td></tr><tr bgcolor=ffffff><td>> Текст3</td><td><b>10.70</td></tr><tr bgcolor=EEF4FA><td>> Текст4</td><td><b><font color=EEF4FA>_</font>9.15</td></tr>
pattern1 = re.compile(u'(?<=Текст1</td><td><b>)\d{1,2}\.\d{2}')
pattern2 = re.compile(u'(?<=Текст2</td><td><b>)\d{1,2}\.\d{2}')
pattern3 = re.compile(u'(?<=Текст3</td><td><b>)\d{1,2}\.\d{2}')
pattern4 = re.compile(u'(?<=Текст4</td><td><b>)\d{1,2}\.\d{2}')
pattern4 = re.compile(u'(?<=Текст4</td><td><b>).*?\d{1,2}\.\d{2}')
Офлайн
может стоит использовать модуль HTMLParser?
Офлайн
Dimka665Спасибо, я посмотрю, что можно с ним сделать.
может стоит использовать модуль HTMLParser?
Офлайн
как-нибудь так? =)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
subject = """
<tr bgcolor=ffffff><td>> Текст1</td><td><b>12.22</td></tr>
<tr bgcolor=EEF4FA><td>> Текст2</td><td><b>12.10</td></tr>
<tr bgcolor=ffffff><td>> Текст3</td><td><b>10.70</td></tr>
<tr bgcolor=EEF4FA><td>> Текст4</td><td><b><font color=EEF4FA>_</font>9.15</td></tr>
"""
print re.findall(r"<tr .+Текст\d.+>(\d{1,2}\.\d{2})<.+</tr>", subject)
Отредактировано (Дек. 4, 2008 14:35:01)
Офлайн
> Но все-таки хотелось бы понять, можно ли это сделать с помощью re.
Можно, но не нужно.
Если это не xhtml или он не валидный смотри на html5lib и/или BeautifulSoup. Если это валидный xml (xhtml) смотри на стандартный xml и всё что в нём есть. Так же может быть полезным ElementTree, он входит в Python 2.5 (xml.etree) и стоит посмотреть на дополнения стандартного xml PyXML (python-xml). Существует еще несколько пакетов для работы с xml.
..bw
Отредактировано (Дек. 4, 2008 14:39:13)
Офлайн
Ух ты, спасибо!
Вижу, что мне еще учиться и учиться :)
Офлайн
bw
и вам спасибо, просто для меня важно понять regexp'ы
но раз так советуете воспользоваться парсерами HTML - обязательно посмотрю
Офлайн
> просто для меня важно понять regexp'ы
Регулярные выражения в этой задаче, просто не практичны. И если кто-то решит дорабатывать ваш код (это можете оказаться и вы, через 3-6 месяцев), он просто утонет в них. А возвращаться к ним придется, так как современный HTML куда сложнее пару треугольных скобок. Сложнее не потому что он так крут, а потому что никто не соблюдает стандарты. В каких-то локальных задачах (быстрое извлечение контента со страницы) регулярки могут выигрывать у валидирующих парверов, но это палка о двух концах, полученный контент может оказаться некорректным (битым) или вообще в половине случаев не тем.
..bw
Офлайн
# -*- coding: utf-8 -*-
import re
st = u'<tr bgcolor=ffffff><td> Текст1</td><td><b>12.22</td></tr><tr bgcolor=EEF4FA><td> Текст2</td><td><b>12.10</td></tr><tr bgcolor=ffffff><td> Текст3</td><td><b>10.70</td></tr><tr bgcolor=EEF4FA><td> Текст4</td><td><b><font color=EEF4FA>_</font>9.15</td></tr>'
pattern1 = re.compile(u'(?<=Текст4</td><td><b>)(<font color=EEF4FA>_</font>)?(\d{1,2}\.\d{2})')
print pattern1.findall(st)[0][1]
Отредактировано (Дек. 4, 2008 14:52:29)
Офлайн
bwВ принципе я согласен, но все же посоветовал бы комбинировать методы. Регексп + BeautifulSoup или другая библиотека.
Регулярные выражения в этой задаче, просто не практичны. И если кто-то решит дорабатывать ваш код (это можете оказаться и вы, через 3-6 месяцев), он просто утонет в них. А возвращаться к ним придется, так как современный HTML куда сложнее пару треугольных скобок. Сложнее не потому что он так крут, а потому что никто не соблюдает стандарты. В каких-то локальных задачах (быстрое извлечение контента со страницы) регулярки могут выигрывать у валидирующих парверов, но это палка о двух концах, полученный контент может оказаться некорректным (битым) или вообще в половине случаев не тем.
>>> s='''<tr bgcolor=ffffff><td>> Текст1</td><td><b>12.22</td></tr><tr bgcolor=EEF4FA><td>> Текст2</td><td><b>12.10</td></tr><tr bgcolor=ffffff><td>> Текст3</td><td><b>10.70</td></tr><tr bgcolor=EEF4FA><td>> Текст4</td><td><b><font color=EEF4FA>_</font>9.15</td></tr>'''
>>> o=re.compile('Текст(\d+)')
>>> o.findall(s)
['1', '2', '3', '4']
Офлайн