Исправить массив неполных ссылок

Я пишу сценарий bash, который найдет ссылки на странице. Он загружает исходный код со страницы и находит ссылки в тегах и сохраняет их в массив, $ links. Проблема состоит в том, что некоторые ссылки не будут включать весь URL-адрес, а только подстраницу или файл. Скажем, исходный код страницы выглядит так:

<h1>Julian's crappy webpage</h1> <a href="http://one.com">Page One</a> <a href="https://two.com">Page Two</a> <a href="/three">Page Three</a> <a href="four">Page Four</a> 

После нахождения ссылок массив будет выглядеть примерно так:

 http://one.com https://two.com /three four 

У меня также есть переменная $ URL, которая является допустимым URL, например " https://google.com "

Мне нужен способ сделать все элементы в $ link действительными, выполняя разные вещи на основе элемента. Для каждого элемента в $ link :

  • Если элемент начинается с /, то объединяйте: $ URL + $ {links [n]}
  • Если элемент не начинается с «/» или «https: //» или «http: //», тогда объединяйте: $ URL + «/» + $ {links [n]}

Ожидаемый ответ, например, выше:

 http://one.com https://two.com https://google.com/three https://google.com/four 

Вот пример скрипта, который вы можете использовать для реализации этого:

 #!/bin/bash shopt -s extglob readonly URL="https://google.com" links=($(grep -o -P '(?<=href=").*(?=")' source.html)) # read into array for ((i=0; i<${#links[@]}; i++)) do case ${links[$i]} in http*) : # do nothing ;; /*) links[$i]="$URL"${links[$i]}; # update array ;; *) links[$i]="$URL/"${links[$i]}; # update array ;; esac done 

Предполагается, что source.html – это загруженный источник веб-страницы в текущем каталоге.

Существует множество способов, по которым использование регулярного выражения для анализа HTML может пойти не так . Даже для кажущейся простой задачи, такой как извлечение URL-адресов из файла HTML.

Поэтому не используйте регулярное выражение. Вместо этого используйте что-то вроде этого:

 #! /bin/bash htmlfile='./file.html' URL='https://google.com' links=($(lynx -dump -listonly -nonumbers -force_html "$htmlfile" | sed -e "s=^file://=$URL=")) printf "%s\n" "${links[@]}" 

Для этого требуется установка lynx . lynx – это текстовый веб-браузер, основанный на ncurses. Он используется здесь, чтобы просто создать список ссылок в файле HTML, поскольку lynx уже решил намного сложнее, чем вы могли бы подумать о том, как надежно находить URL-адреса в HTML-контенте (это важная часть работы браузера). Другие языки, такие как perl или python имеют хорошие библиотечные модули для разбора HTML для извлечения URL-адресов. Для сценариев оболочки используйте lynx .

См. man lynx для деталей.

lynx почти наверняка доступна предварительно упакованная для вашего дистрибутива Linux или других unix-подобных ОС. Если нет, вы можете получить исходный код по ссылке выше.