Очень хороший инструмент для проверки мертвых ссылок (например, ссылок, указывающих на ошибки 404) - wget --spider
. Тем не менее, у меня есть несколько другой пример использования, когда я создаю статический веб-сайт и хочу проверить наличие неработающих ссылок перед загрузкой. Точнее, я хочу проверить оба:
-
Относительные ссылки, такие как
<a href="some/file.pdf">file.pdf</a>
-
Абсолютные ссылки, скорее всего, на внешние сайты, например
<a href="#" onclick="location.href='http://example.com'; return false;">example</a>
.
Я попробовал wget --spyder --force-html -i file-to-check.html
, который читает локальный файл, рассматривает его как HTML и следует за каждой ссылкой. К сожалению, он не может относиться к относительным ссылкам в локальном HTML файле (ошибки с помощью Cannot resolve incomplete link some/file.pdf
). Я попытался использовать file://
но wget
не поддерживает его.
В настоящее время у меня есть хак, основанный на запуске локального веб-сервера через python3 http.serve
и проверке локальных файлов через HTTP:
python3 -m http.server &
pid=$!
sleep .5
error=0
wget --spider -nd -nv -H -r -l 1 http://localhost:8000/index.html || error=$?
kill $pid
wait $pid
exit $error
Я не очень доволен этим по нескольким причинам:
-
Мне нужен этот
sleep.5
чтобы ждать, пока веб-сервер будет готов. Без него сценарий терпит неудачу, но я не могу гарантировать, что будет достаточно 0,5 секунд. Я предпочел бы иметь способ запустить командуwget
когда сервер будет готов. -
И наоборот, это
kill $pid
кажется уродливым.
В идеале, у python3 -m http.server
будет возможность запускать команду, когда сервер будет готов, и выключится после завершения команды. Это звучит выполнимо, написав немного Python, но мне было интересно, существует ли более чистое решение.
Я что-то пропустил? Есть ли лучшее решение? Я упоминаю wget
в своем вопросе, потому что он делает почти то, что я хочу, но использование wget
не является обязательным требованием для меня (и не является python -m http.server
). Мне просто нужно что-то легко запускать и автоматизировать в Linux.