Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2013 15:45:11

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

регулярка, выбрать ссылки из текста

>>> import re
>>> str='<a href="1.ru">11111</a>, <a href="2.ru">222222</a>'
>>> re.findall(r'<a.*>.*</a>', str)
['<a href="1.ru">11111</a>, <a href="2.ru">222222</a>']
>>>
подскажите пожалуйста, почему находится две ссылки одной строкой. Мне надо найти каждую ссылку отдельно

Офлайн

#2 Июль 1, 2013 17:14:08

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

регулярка, выбрать ссылки из текста

.* - очень жадный (greedy)

re.findall(r'<a[^>]*>[^<]*</a>', str)
Чтобы уменьшить его жадность:
re.findall(r'<a.*?>.*?</a>', str)
Но это не всегда спасет, поэтому правильнее задать ограничения явно:
re.findall(r'<a[^>]*>[^<]*</a>', str)

А если вспомнить о вложенных тегах, то re стоит заменить на lxml или похожее.

Офлайн

#3 Июль 1, 2013 23:14:34

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

регулярка, выбрать ссылки из текста

reclosedev
Абсолютно согласен. Если документ небольшой можно работать с xml. Для него в Бизли Д есть даже русская дока с примерами.



Офлайн

#4 Июль 2, 2013 02:10:56

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

регулярка, выбрать ссылки из текста

>>> import lxml.html
>>> 
>>> s = """<a href="1.ru">11111</a>, <a href="2.ru">222222</a>"""
>>> 
>>> html = lxml.html.fromstring(s)
>>> data = [(node.attrib['href'], node.text)
...         for node in html.iterchildren('a')]
>>> print(data)
[('1.ru', '11111'), ('2.ru', '222222')]
>>>



Отредактировано py.user.next (Июль 2, 2013 02:32:44)

Офлайн

#5 Июль 2, 2013 06:33:46

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

регулярка, выбрать ссылки из текста

спасибо всем.
теперь все понятно.
Больше интересовало правильное построение регулярки.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version