Вообще-то URL надо еще и подменить-обернуть (пробую сделать что-то типа веб-прокси на Django) но это уже мелочи. Сначала надо найти URL и URI... Для простоты буду все называть URL.
Я знаю о существовании
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>
... а еще бывает, что
BeautifulSoup обнаруживает, что-то, что похоже на URL, но это им не является (например, как в конструкции типа
<img src='data:image/jpeg;base64
).
Все эти варианты найти с помощью
BeautifulSoup и дальше разобрать не просто, но всё ещё можно. Но
BeautifulSoup не поможет, если некоторые HTM-теги не закрыты. Например, попадется конструкция
<link href="URL">
(без финализирующей
/>
) и тогда
BeautifulSoup "проглотит" весь HTML до следующего
<link>
(а его может больше и не быть на странице... к слову если стил написания HTML-кода "не закрывать теги", то
BeautifulSoup вообще бессилен).
Если же использовать регулярные выражения, то все становится очень сложно, т.к. URL внутри HTML может быть не оформлен в кавычки (и тогда он воспринимается до ближайшего пробела). Или иметь произвольные пробельные символы (например:
html
<a href
=
"URL"> ...
Я думаю случаев употребления URL намного больше. Я уж не говорю про случаи когда URL встречается внутри встроенного в JavaScript
(а там иногда стараются скрыть URL от паркинга... впрочем раз скрывают, то и пусть так и будет... но "открытые" URL хотелось бы обнаруживать).
И как это все разобрать? Написать универсальное регулярное выражение для всех случаев -- не способен.
BeautifulSoup, как я объяснил, не всегда помогает. Есть ли какие-нибудь альтернативы по обнаружению URL?