Регулярное выражение для извлечения 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 ответа:
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'))