Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

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

Вообще-то 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?
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Я бы всё же копал в сторону регулярок. Слишком уж много мест где URL могут встретиться.
Так что я бы сказал примерно такое...
(["'])(https?://.+?)\1
Т.е. "в начале кавычка или апостроф, затем что-то, начинающееся с http:// или https://, потом любые символы, но как можно меньше, а потом тот же символ что и в начале".
Написал маленький скрипт, натравил его на исходник этой страницы - по-моему, работает неплохо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы