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

Если вам действительно нужна старая версия php и вы все еще хотите использовать актуальную версию os (что вам следует !!)

, вы можете попробовать docker:

docker-compose .yml:

version: "3.5"

services:
   php: 
       image: php:5.6-apache
       ports:
          - 80:80
       volumes:
          - ./:/var/www/html

-> это ограничит ваше одно приложение для использования этой старой версии php

33
задан Paul D. Waite 20 December 2011 в 07:53
поделиться

7 ответов

Если Вы только ищете тот:

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 строка, в которой Вы ищете соответствия.

Быстрое объяснение regexp битов:

r'...' "необработанная" строка. Это останавливает Вас имеющий необходимость волноваться о выходе из символов вполне так, как Вы обычно были бы. (\ особенно - в сырых данных представляют в виде строки \, просто \. В обычной строке необходимо было бы сделать \\ каждый раз, и это становится старым в regexps.)

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

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

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

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

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

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

, После того как Вы установили BeautifulSoup, так или иначе.

69
ответ дан 27 November 2019 в 17:30
поделиться

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

14
ответ дан 27 November 2019 в 17:30
поделиться

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

import re
url='<a href="http://www.ptop.se" target="_blank">http://www.ptop.se</a>'
r = re.compile('(?<=href=").*?(?=")')
r.findall(url)
12
ответ дан 27 November 2019 в 17:30
поделиться

Существуют тонны их на regexlib

1
ответ дан 27 November 2019 в 17:30
поделиться

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

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

4
ответ дан 27 November 2019 в 17:30
поделиться

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

1
ответ дан 27 November 2019 в 17:30
поделиться

John Gruber (who wrote Markdown, which is made of regular expressions and is used right here on Stack Overflow) had a go at producing a regular expression that recognises URLs in text:

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

If you just want to grab the URL (i.e. you’re not really trying to parse the HTML), this might be more lightweight than an HTML parser.

11
ответ дан 27 November 2019 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: