Как сопоставить все ссылки в регулярном выражении Python?

Я пытаюсь создать регулярное выражение, которое соответствует ссылке из источника страницы. У меня есть текст, отформатированный следующим образом:

что-то здесь вот ссылка

<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>

Я хочу получить все ссылки, начинающиеся с href="https://www.here.com/(.*)?ref=br_rs">

Так что по ссылкам о я бы получил либо всю ссылку, либо FIrstCal и Mall (по ссылке)

Код Python:

regex = r'(?<=href="https://www.here.com/).*(?<=?ref=br_rs)'

link = re.findall(regex, str(source))

link

Но это не работает.

Любые идеи ?

PS: регулярные выражения — единственный способ сделать это. Анализ HTML не будет работать, потому что структура веб-сайта нестабильна.


person icebox19    schedule 26.02.2014    source источник
comment
Обязательная ссылка: RegEx соответствует открытым тегам, кроме автономных тегов XHTML   -  person Martijn Pieters    schedule 26.02.2014
comment
Не ходите туда, используйте парсер HTML и сделайте свою жизнь намного проще. Регулярные выражения — не лучший инструмент для анализа HTML.   -  person Martijn Pieters    schedule 26.02.2014
comment
Я знаю, но я пытаюсь очистить веб-сайт, который очень часто меняет идентификаторы div, классы, поэтому единственный способ, которым я мог бы воспользоваться, - это регулярное выражение. Я хотел бы парсер html, но я не могу здесь   -  person icebox19    schedule 26.02.2014
comment
BeautifulSoup может легко справиться с этим случаем, применяя регулярные выражения только к значениям атрибутов. soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs')) например.   -  person Martijn Pieters    schedule 26.02.2014


Ответы (1)


Используйте BeautifulSoup с регулярным выражением, соответствующим только содержимому href:

soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))

Синтаксическому анализатору все равно, что структура меняется, вам просто нужно быть точным в отношении того, что является стабильным; ссылки.

Демо:

>>> import re
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''\
... <a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a><span class="mls _1ccm9 _49"></span><a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a><span class="m1ls _1cm9 _49"></span>
... ''')
>>> soup.find_all('a', href=re.compile('https://www.here.com/.*?ref=br_rs'))
[<a class="_5syj" href="https://www.here.com/FirstCal?ref=br_rs">First Cal</a>, <a class="_fasc" href="https://www.here.com/Mall?ref=br_rs">Mall</a>]
person Martijn Pieters    schedule 26.02.2014
comment
Я не могу установить BeautifulSoup. Я пытаюсь установить его с помощью pip3.3 для python 3.3, но получаю сообщение об ошибке модульных тестов. - person icebox19; 26.02.2014
comment
В чем ошибка? Вы можете скопировать и вставить это для нас? Спасибо! :) - person Ryan O'Donnell; 26.02.2014
comment
@icebox19: что там за ошибка? У меня не было проблем с установкой BeautifulSoup на Python 3.3 с помощью pip. - person Martijn Pieters; 26.02.2014
comment
@icebox19: вы устанавливаете BeautifulSoup 3, который несовместим с Python 3. Вместо этого установите BeautifulSoup 4: pip3.3 install beautifulsoup4. - person Martijn Pieters; 26.02.2014