Простейшее применение lynx заключается в извлечении списка адресов URL, находящихся в данной веб-странице, что может пригодиться при поиске ссылок в Интернете. Выше мы говорили, что в этом издании книги предпочли уйти от lynx в сторону curl, но, как оказывается, lynx в сто раз удобнее для решения этой задачи (см. листинг 7.4), чем curl, потому что автоматически анализирует разметку HTML, тогда как curl вынуждает вас делать это вручную.
В вашей системе нет программы lynx? Большинство современных систем Unix снабжается диспетчерами пакетов, такими как yum в Red Hat, apt в Debian и brew в OS X (впрочем, brew не устанавливается по умолчанию), с помощью которых можно установить lynx. Если вы решите скомпилировать lynx самостоятельно или пожелаете загрузить скомпилированные двоичные файлы, вы найдете все необходимое по адресу: http://lynx.browser.org/.
Код
Листинг 7.4. Сценарий getlinks
#!/bin/bash
# getlinks — получая URL, возвращает все относительные и абсолютные ссылки.
#·· Принимает три параметра: −d генерирует первичные домены в каждой ссылке,
#·· −i выводит список только внутренних ссылок на сайт (то есть на другие
#·· страницы на том же сайте), и −x выводит список только внешних ссылок
#·· (в противоположность −i).
if [$# −eq 0]; then
··echo "Usage: $0 [-d|-i|-x] url" >&2
··echo "-d=domains only, −i=internal refs only, −x=external only" >&2
··exit 1
fi
if [$# −gt 1]; then
··case "$1" in
········ shift
········;;
····-r) basedomain="http://$(echo $2 | cut −d/ −f3)/"
········shift
········;;
····-a) basedomain="http://$(echo $2 | cut −d/ −f3)/"
········shift
········;;
···· *) echo "$0: unknown option specified: $1" >&2
········exit 1
··esac
else
fi
lynx −dump "$1"|\
··grep −E '[[: digit: ]]+\.'|\
··awk '{print $2}'|\
··cut −d\? -f1 |\
exit 0
Как это работает
Отображая страницу, lynx отображает ее текст, стремясь сохранить форматирование как можно ближе к оригиналу, а также список всех гипертекстовых ссылок, найденных на этой странице. Данный сценарий извлекает только ссылки с использованием команды sed для вывода всего, что следует за строкой «References» (Ссылки) в тексте веб-страницы
Этот сценарий демонстрирует один интересный прием: настройку переменной lastcmd (
Запуск сценария
По умолчанию сценарий выводит список всех ссылок, найденных на указанной веб-странице, и не только тех, которые начинаются с префикса http:. Сценарию может быть передано три необязательных флага, влияющих на результат: флаг −d требует выводить только доменные имена в совпавших адресах URL, флаг −r требует оставить в списке только
Результаты
Простой запуск сценария возвращает список всех ссылок, найденных на указанной странице, как показано в листинге 7.5.
Листинг 7.5. Запуск сценария getlinks
$ getlinks http://www.daveonfilm.com/ | head -10
http://instagram.com/d1taylor
http://pinterest.com/d1taylor/
http://plus.google.com/110193533410016731852