Как найти все URL внутри HTML с помощью Python?

Я знаю о существовании BeautifulSoup и его возможностях по разбору (и замене) HTML. Но в реальности задача оказывается ему не по зубам.

Для начала URL может встречаться не только в <a href="URL">что-то</a> или <img src="URL" /> , но и в <link href="URL" />, в <script src="URL"></script>, в <iframe src="URL" ... а еще в стилях (например, как background-image:url(URL) или @import url(URL) ...), а ещё во встроенных SVG (например, как <a xlink:href="URL")... и так далее.

Кроме того, URL может встречаться в конструкциях типа <object data="URL" type="image/svg+xml" ...></object> или даже внутри встроенных JavaScript... а еще бывает что BeautifulSoup обраруживает, что-то что похоже на URL, но им не является (например, <img src='data:image/jpeg;base64).

Все эти варианты найти с помощью BeautifulSoup не просто, но еще можно. Но он поможет, если некоторые HTM-теги не закрыты. Например, попадется конструкция <link href="URL"> (без финализирующей />) и тогда BeautifulSoup "проглотит" весь дальнейший HTML до следующего (а его может не и быть).

Если же использовать регулярные выражения, то все становится очень сложно, т.к. URL внутри HTML может быть не оформлен в кавычки (и тогда он воспринимается до ближайшего пробела). Или иметь произвольные пробельные символы (например:

<a href
=
"URL"> ...

Я думаю случаев употребления URL намного больше. И как их все разобрать? Написать универсальное регулярное выражение для всех случаев -- не способен, а BeautifulSoup, как я объяснил, не всегда помогает. Есть ли какие-нибудь альтернативы по обнаружению URL?


Ответы (0 шт):