Регулярное выражение для извлечения URL-адресов из атрибута href в HTML с помощью Python [дубликат]


Возможные Дубликаты:
какое регулярное выражение Лучше всего проверить, является ли строка допустимым URL-адресом?

рассматривая строку следующим образом:

string = "<p>Hello World</p><a href="http://example.com">More Examples</a><a href="http://example2.com">Even More Examples</a>"

как я мог, с Python, извлечь URL-адреса, внутри href якорного тега? Что-то вроде:

>>> url = getURLs(string)
>>> url
['http://example.com', 'http://example2.com']

спасибо!

2 74

2 ответа:

import re

url = '<p>Hello World</p><a href="http://example.com">More Examples</a><a href="http://example2.com">Even More Examples</a>'

urls = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', url)

>>> print urls
['http://example.com', 'http://example2.com']

лучший ответ...

не используйте регулярное выражение

выражение принято отвечать мимо многих случаях. Среди прочего,URL-адреса могут иметь символы юникода в них. Регулярное выражение, которое вы хотите здесь, и посмотрев на него, вы можете сделать вывод, что вы действительно не хотите его в конце концов. Самая правильная версия десять тысяч символов.

по общему признанию, если бы вы начали с простой, неструктурированный текст с кучей URL-адресов в нем, тогда вам может понадобиться это регулярное выражение длиной в десять тысяч символов. Но если ваш вход структурирован, используйте структуру. Ваша заявленная цель- " извлечь url-адрес внутри href тега привязки.- Зачем использовать регулярное выражение длиной в десять тысяч символов, когда можно сделать что-то гораздо проще?

разбирать HTML вместо

для многих задач, используя Красивый Суп будет гораздо быстрее и легче использование:

>>> from bs4 import BeautifulSoup as Soup
>>> html = Soup(s, 'html.parser')           # Soup(s, 'lxml') if lxml is installed
>>> [a['href'] for a in html.find_all('a')]
['http://example.com', 'http://example2.com']

если вы предпочитаете не использовать внешние инструменты, вы также можете напрямую использовать собственную встроенную библиотеку синтаксического анализа HTML Python. Вот действительно простой подкласс HTMLParser что делает именно то, что вы хотите:

from html.parser import HTMLParser

class MyParser(HTMLParser):
    def __init__(self, output_list=None):
        HTMLParser.__init__(self)
        if output_list is None:
            self.output_list = []
        else:
            self.output_list = output_list
    def handle_starttag(self, tag, attrs):
        if tag == 'a':
            self.output_list.append(dict(attrs).get('href'))