Регулярное выражение для извлечения URL из ссылки HTML - PullRequest
31 голосов
/ 31 января 2009

Я новичок в Python. Я изучаю регулярные выражения, но мне нужна помощь здесь.

Вот источник HTML:

<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>

Я пытаюсь закодировать инструмент, который печатает только http://ptop.se. Можете ли вы помочь мне, пожалуйста?

Ответы [ 10 ]

67 голосов
/ 31 января 2009

Если вы ищете только один:

import re
match = re.search(r'href=[\'"]?([^\'" >]+)', s)
if match:
    print match.group(0)

Если у вас есть длинная строка, и вы хотите, чтобы в ней был каждый экземпляр шаблона:

import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
print ', '.join(urls)

Где s - строка, в которой вы ищете совпадения.

Быстрое объяснение битов регулярного выражения:

r'...' является «необработанной» строкой. Это избавит вас от необходимости беспокоиться о побеге персонажей так же, как обычно. (\ особенно - в необработанной строке \ - это просто \. В обычной строке вам придется каждый раз делать \\, и это получает old в регулярных выражениях .)

"href=[\'"]?" говорит, что соответствует "href =", возможно, за ним следует ' или ". «Возможно», потому что трудно сказать, насколько ужасен HTML, на который вы смотрите, и кавычки не являются строго обязательными.

Включение следующего бита в "()" говорит о том, чтобы сделать его "группой", что означает разделить его и вернуть нам отдельно. Это просто способ сказать: «Это та часть паттерна, которая мне интересна».

"[^\'" >]+" говорит, что соответствует любым символам, которые не ', ", > или пробел. По сути это список символов, которые являются концом URL. Это позволяет нам не пытаться написать регулярное выражение, которое надежно соответствует полному URL, что может быть немного сложным.

Предложение в другом ответе использовать BeautifulSoup неплохо, но оно вводит более высокий уровень внешних требований. Кроме того, это не поможет вам в вашей заявленной цели изучения регулярных выражений, и я бы предположил, что этот конкретный проект парсинга html является лишь частью.

Это довольно легко сделать:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_to_parse)
for tag in soup.findAll('a', href=True):
    print tag['href']

После установки BeautifulSoup, в любом случае.

14 голосов
/ 31 января 2009

Не используйте регулярные выражения, используйте BeautifulSoup . Это, или быть настолько грубым, чтобы вызвать его, скажем, к w3m / lynx и вернуть то, что рендерит w3m / lynx. Во-первых, возможно, это более элегантно, а во-вторых, гораздо быстрее работал над неоптимизированным кодом, который я написал некоторое время назад.

12 голосов
/ 31 января 2009

это должно сработать, хотя могут быть и более элегантные способы.

import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)
10 голосов
/ 28 ноября 2009

Джон Грубер (который написал Markdown, который состоит из регулярных выражений и используется здесь, в Stack Overflow) попытался создать регулярное выражение, которое распознает URL-адреса в тексте:

http://daringfireball.net/2009/11/liberal_regex_for_matching_urls

Если вы просто хотите захватить URL-адрес (т. Е. Вы на самом деле не пытаетесь анализировать HTML-код), это может быть проще, чем анализатор HTML-кода.

4 голосов
/ 13 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

В частности, вы захотите посмотреть ответы Python: BeautifulSoup , HTMLParser и lxml .

1 голос
/ 20 мая 2016

Это работает очень хорошо при использовании дополнительных совпадений (печатается после href=) и получает только ссылку. Проверено на http://pythex.org/

(?:href=['"])([:/.A-z?<_&\s=>0-9;-]+)

Oputput:

Совпадение 1. / wiki / Main_Page

Совпадение 2. / wiki / Portal: Содержание

Матч 3. / wiki / Portal: Featured_content

Матч 4. / wiki / Portal: Current_events

Матч 5. / wiki / Special: Random

Матч 6. //donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en

1 голос
/ 13 мая 2009

Да, их множество на regexlib . Это только доказывает, что RE не должны использоваться для этого. Используйте SGMLParser или BeautifulSoup или напишите парсер - но не используйте RE. Те, которые, кажется, работают, чрезвычайно сложны и все еще не покрывают все случаи.

1 голос
/ 31 января 2009
0 голосов
/ 24 апреля 2018

Вы можете использовать это.

<a[^>]+href=["'](.*?)["']
0 голосов
/ 09 марта 2017

это регулярное выражение может вам помочь, вы должны получить первую группу \ 1 или любым другим способом, который у вас есть на вашем языке.

href="([^"]*)

пример:

<a href="http://www.amghezi.com">amgheziName</a>

результат:

http://www.amghezi.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...