Я пытаюсь использовать grep и cut для извлечения URL-адресов из файла HTML. Ссылки выглядят так:
<a href="http://examplewebsite.com/">
Другие сайты имеют .net
, .gov
но я предполагаю, что я мог бы сделать точку отсечки прямо перед >
. Так что я знаю, что могу использовать grep и cut как-то, чтобы отключить все до http и после .com, но я застрял на нем некоторое время.
shell-script
grep
string
cut
eltigre
источник
источник
<>
вынуждает его отображаться как тег HTML.Ответы:
Как я уже сказал в своем комментарии, анализировать HTML с помощью регулярных выражений, как правило, не очень хорошая идея, но иногда это может сойти с рук, если анализируемый HTML работает правильно.
Чтобы получить только те URL-адреса, которые находятся в
href
атрибуте<a>
элементов, я считаю, что проще всего сделать это в несколько этапов. Судя по вашим комментариям, вам нужен только домен верхнего уровня, а не полный URL. В этом случае вы можете использовать что-то вроде этого:где
source.html
файл, содержащий HTML-код для разбора.Этот код будет печатать все URL верхнего уровня, которые встречаются как
href
атрибуты любых<a>
элементов в каждой строке.-i
Вариант первойgrep
команды является обеспечение того , она будет работать на обоих<a>
и<A>
элементов. Я полагаю, вы могли бы также дать-i
2-й,grep
чтобы захватитьHREF
атрибуты верхнего регистра , OTOH, я бы предпочел игнорировать такой сломанный HTML. :)Для обработки содержимого
http://google.com/
выход
Мой вывод немного отличается от других примеров, так как я перенаправлен на австралийскую страницу Google.
источник
://
мы принимаем только символы перед первым/
или"
. Но если вы хотите увидеть полный URL, измените эту команду наgrep -Eo '(http|https)://[^"]+
. Другой вариант для этой строки -grep -Eo '(http|https)://[^?"]+'
это отключение параметров запроса. Однако этот вариант будет по-прежнему печатать URL-адреса, содержащиеся в другом URL-адресе, в качестве параметра запроса, но они будут напечатаны в отдельной строке.Не уверен, если вы ограничены в инструментах:
Но регулярное выражение, возможно, не лучший путь, как уже упоминалось, но вот пример, который я собрал:
Выход:
Вы также можете добавить,
\d
чтобы поймать другие типы чисел.источник
sort -u
?Если ваш grep поддерживает регулярные выражения Perl:
(?<=href=")
и(?=")
являются обходными выражениями дляhref
атрибута. Это требует-P
выбора.-o
печатает соответствующий текст.Например:
Как обычно, нет никакой гарантии, что это допустимые URI или что HTML-код, который вы анализируете, будет действительным.
источник
В качестве альтернативы без регулярных выражений , используйте pup :
Найдет все
a
элементы, имеющиеhref
атрибут, затем отобразит значениеhref
атрибута.Для установки
pup
вам нужен Go (язык программирования):Преимущество этого решения в том, что оно не зависит от правильного форматирования HTML .
источник
pup
, время установить это ....pup 'a.classname[href] attr{href}' < tut.html >links.md
Я нашел здесь решение , которое ИМХО намного проще и потенциально быстрее, чем было предложено здесь. Я немного настроил поддержку файлов https. Но версия TD; TR ...
PS: Вы можете заменить URL сайта на путь к файлу, и он будет работать так же.
Если вы просто хотите увидеть ссылки, а не помещать их в файл, попробуйте вместо этого ...
Результат будет выглядеть примерно так:
Для моего случая использования это работало просто отлично. Но остерегайтесь того факта, что в настоящее время люди добавляют ссылки типа src = "// blah.tld" для CDN URI библиотек. Я не хотел видеть их в найденных ссылках.
Не нужно пытаться проверять ссылки или ссылки на другие источники, потому что "lynx -dump" по умолчанию извлекает все кликабельные ссылки с данной страницы. Поэтому единственное, что вам нужно сделать после этого, - это проанализировать результат «lynx -dump» с использованием grep, чтобы получить более чистую версию того же результата.
источник
... вероятно, будет очень хорошо. Как написано, он печатает:
Если важно, чтобы вы сопоставляли только ссылки и из этих доменов верхнего уровня, вы можете сделать:
... или что-то в этом роде - хотя для некоторых
sed
вам может понадобиться заменить буквенный\n
символ ewline для каждого из последних двухn
.Как написано, приведенная выше команда печатает:
... и в любом случае (но, вероятно, наиболее полезно с последним) вы можете прикрепить
|sort -u
фильтр до конца, чтобы получить списокsort
и удалить дубликаты.источник
самый короткий
источник
источник