Как использовать grep и вырезать скрипт для получения URL-адресов веб-сайтов из файла HTML

Я пытаюсь использовать grep и вырезать для извлечения URL-адресов из HTML-файла. Ссылки выглядят так:

<a href="http://examplewebsite.com/"> 

На других сайтах есть .net , .gov , но я полагаю, что я мог бы сделать точку отсечения прямо перед > . Поэтому я знаю, что могу использовать grep и разрезать так или иначе, чтобы отрезать все до http и после .com, но я некоторое время застрял на нем.

  • Удалить последний символ из строки, захваченной с помощью awk
  • Как я могу добавить и добавить к каждому члену массива?
  • У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?
  • Как найти позицию персонажа с помощью grep?
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • grep окружающие символы матча
  • Подстрока grep между кавычками
  • Zsh скрипт, как конкатенировать элементы массива со строкой
  • 5 Solutions collect form web for “Как использовать grep и вырезать скрипт для получения URL-адресов веб-сайтов из файла HTML”

    Как я уже сказал в своем комментарии, обычно не рекомендуется анализировать HTML с помощью регулярных выражений, но иногда вы можете обойтись без него, если хорошо разбирается HTML-анализ.

    Чтобы получать URL-адреса, которые находятся в атрибуте <a> элементов <a> , мне легче всего сделать это на нескольких этапах. Из ваших комментариев кажется, что вам нужен домен верхнего уровня, а не полный URL. В этом случае вы можете использовать что-то вроде этого:

     grep -Eoi '<a [^>]+>' source.html | grep -Eo 'href="[^\"]+"' | grep -Eo '(http|https)://[^/"]+' 

    где source.html – это файл, содержащий HTML-код для анализа.

    Этот код будет печатать все URL верхнего уровня, которые являются атрибутами href любых <a> элементов в каждой строке. Параметр -i для первой команды grep состоит в том, чтобы гарантировать, что она будет работать как с элементами <a> и с <A> . Я думаю, вы могли бы также дать -i во второй grep для захвата атрибутов HREF верхнего регистра, OTOH, я бы предпочел игнорировать такой сломанный HTML. 🙂

    Чтобы обработать содержимое http://google.com/

     wget -qO- http://google.com/ | grep -Eoi '<a [^>]+>' | grep -Eo 'href="[^\"]+"' | grep -Eo '(http|https)://[^/"]+' 

    вывод

     http://www.google.com.au http://maps.google.com.au https://play.google.com http://www.youtube.com http://news.google.com.au https://mail.google.com https://drive.google.com http://www.google.com.au http://www.google.com.au https://accounts.google.com http://www.google.com.au https://www.google.com https://plus.google.com http://www.google.com.au 

    Моя продукция немного отличается от других примеров, так как я перенаправляюсь на Австралийскую страницу Google.

    Если ваш grep поддерживает регулярные выражения Perl:

     grep -Po '(?<=href=")[^"]*(?=")' 
    • (?<=href=") и (?=") являются обратными выражениями для атрибута href . Для этого нужен параметр -P .
    • -o печатает соответствующий текст.

    Например:

     $ curl -sL https://www.google.com | grep -Po '(?<=href=")[^"]*(?=")' /search? https://www.google.co.in/imghp?hl=en&tab=wi https://maps.google.co.in/maps?hl=en&tab=wl https://play.google.com/?hl=en&tab=w8 https://www.youtube.com/?gl=IN&tab=w1 https://news.google.co.in/nwshp?hl=en&tab=wn ... 

    Как обычно, нет никакой гарантии, что это допустимые URI, или что синтаксический анализ HTML будет действительным.

    Не уверен, что вы ограничены инструментами:

    Но регулярное выражение может быть не лучшим способом, как упоминалось, но вот пример, который я собрал:

     cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort | uniq 
    • grep -E: то же самое, что и egrep
    • grep -o: выводит только то, что было grepped
    • (http | https): является либо / или
    • az: все строчные буквы
    • AZ: все в порядке
    • , : точка
    • \?: является ?
    • *: повторяет группу […]
    • uniq: удалит любые дубликаты

    Вывод:

     bob@bob-NE722:~s$ wget -qO- http://google.com/ | grep -Eo "(http|https)://[\da-z./?A-Z0-9\D=_-]*" | uniq http://schema.org/WebPage http://www.google.com/imghp?hl=en http://maps.google.com/maps?hl=en https://play.google.com/?hl=en http://www.youtube.com/?tab=w1 http://news.google.com/nwshp?hl=en https://mail.google.com/mail/?tab=wm https://drive.google.com/?tab=wo http://www.google.com/intl/en/options/ http://www.google.com/history/optout?hl=en https://accounts.google.com/ServiceLogin?hl=en http://www.google.com/ https://www.google.com/culturalinstitute/project/the-holocaust?utm_source=google https://plus.google.com/116899029375914044550 

    В качестве альтернативы без регулярных выражений используйте щенок :

     pup 'a[href] attr{href}' < yourfile.html 

    Найдут все элементы с атрибутом href , а затем отобразятся значение атрибута href .

    Для установки pup вам нужен Go (язык программирования):

     sudo apt-get install golang sudo go get github.com/ericchiang/pup 

    Преимущество этого решения заключается в том, что он не полагается на правильно отформатированный HTML-код .

     wget -qO- google.com | tr \" \\n | grep https\*:// 

    … вероятно, будет хорошо. Как написано, он печатает:

     http://schema.org/WebPage http://www.google.com/imghp?hl=en&tab=wi http://maps.google.com/maps?hl=en&tab=wl https://play.google.com/?hl=en&tab=w8 http://www.youtube.com/?tab=w1 http://news.google.com/nwshp?hl=en&tab=wn https://mail.google.com/mail/?tab=wm https://drive.google.com/?tab=wo http://www.google.com/intl/en/options/ http://www.google.com/history/optout?hl=en https://accounts.google.com/ServiceLogin?hl=en&continue=http://www.google.com/ https://www.google.com/culturalinstitute/project/the-holocaust?utm_source=google&amp;utm_medium=hppromo&amp;utm_campaign=auschwitz_q1&amp;utm_content=desktop https://plus.google.com/116899029375914044550 

    Если важно, чтобы вы соответствовали только ссылкам и из тех доменов верхнего уровня, вы можете:

     wget -qO- google.com | sed '/\n/P;//!s|<a[^>]*\(https*://[^/"]*\)|\n\1\n|;D' 

    … или что-то в этом роде – хотя для некоторых sed вам может понадобиться заменить буквальный \n символьный символ для каждого из последних двух n s.

    Как написано, вышеприведенная команда печатает:

     http://www.google.com http://maps.google.com https://play.google.com http://www.youtube.com http://news.google.com https://mail.google.com https://drive.google.com http://www.google.com http://www.google.com http://www.google.com https://www.google.com https://plus.google.com 

    … и для любого из них (но, вероятно, наиболее полезно с последним) вы можете использовать фильтр |sort -u до конца, чтобы получить sort списка и сбросить дубликаты.

    Linux и Unix - лучшая ОС в мире.