Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2013 20:16:25

WhiteTiger
Зарегистрирован: 2012-11-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для парсинга тегов

Всем привет. Переношу с PHP на питон код, который парсил html-странички и доставал оттуда содержимое указанных свойств указанных тегов.
Вот оригинал:

preg_match_all(“#<{$tag}(?:.*){$param}?:'|\”|)(.*)(?:'|\“| |>)#iU”,$content,$matches);
Здесь в $tag может лежать “a”, а в $param - “href”. В $content - код html-странички. Выражение прекрасно работает и складывает всё что надо в $matches.
Попробовал в python сделать его аналог вот так:
r = re.compile(“<” + tag + “(?:.*)” + tags + “?:'|\”|)(*)(?:'|\“| |>)”, re.U)
Выражение работает правильно, но, если PHP-вариант из кода “…<a href='/index.php'>link</a>…” достаёт “/index.php” (без кавычек), то python - “/index.php'>link</a>….(и так до последней в коде кавычки)”. То есть он берёт на много больше текста чем нужно.
Подскажите пожалуйста, как сделать так, чтоб Python-аналог извлекал текст от первой кавычки совпадения, и до ближайшей, а не до самой последней?
P.S. И ещё не большой вопрос. Как указать re.compile() несколько флагов? Например re.U вместе с re.I.

Офлайн

#2 Март 28, 2013 22:43:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Регулярное выражение для парсинга тегов

WhiteTiger
который парсил html-странички и доставал оттуда содержимое указанных свойств указанных тегов
есть lxml.html

WhiteTiger
То есть он берёт на много больше текста чем нужно.
ленивая (нежадная) версия - .*?

WhiteTiger
Например re.U вместе с re.I
побитовое сложение - re.U | re.I

поставь задачу

add
заменил “ревнивая” на “ленивая”, так как ревнивая - это сверхжадная



Отредактировано py.user.next (Апрель 4, 2013 09:18:32)

Офлайн

#3 Март 29, 2013 05:29:07

WhiteTiger
Зарегистрирован: 2012-11-15
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярное выражение для парсинга тегов

есть lxml.html
ревнивая (нежадная) версия - .*?
побитовое сложение - re.U | re.I
Не знал, оказывается уже есть готовое решение. Большое спасибо. Именно это мне было нужно!

Офлайн

#4 Март 29, 2013 10:29:48

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Регулярное выражение для парсинга тегов

.*
Такими вещами лучше не баловаться. Если вы знаете, что хотите получить содиржимое внутри тэга, то как минимум это доолжно быть
[^>]*

Отредактировано lorien (Март 29, 2013 10:30:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version