2012-02-05 3 views
0

Я сохранил список ссылок на некоторые ресурсы в своем блоге.
Если я нахожу, что ссылка сломана, я добавляю к ней class="broken".
Иногда сломанные ссылки снова оживают, поэтому я удаляю class="broken".
Когда список идет очень длинный, очень сложно проверить их один за другим.Как проверить неработающие ссылки на веб-странице?

<ul> 
    <li><a href="http://www.a.com">a</a></li> 
    <li><a href="http://www.b.com">b</a></li> 
    <li><a href="http://www.c.com" class="broken">c</a></li> 
    <li><a href="http://www.d.com">d</a></li> 
</ul> 

Как написать сценарий bash, чтобы сделать редактирование?

+0

Комбинация 'grep' и' wget', я бы себе представлял. –

+0

Вам понадобится некоторый RegEx, чтобы извлечь часть href = "...", затем перейдите к , затем замените классом = сломанным. Я думаю, что даже если бы Бэш мог это сделать, это было бы не очень здорово. Если это просто игра, все в порядке, в противном случае я бы пошел с другим языком – Raffaele

+0

, если ниже ссылки помогут вам ... http://giantdorks.org/alain/little-shell-script-to-recursive-check- a-site-for-broken-links/ http://tldp.org/LDP/abs/html/writingscripts.html –

ответ

0

Возможно, это не тот ответ, который вы ищете, но зачем это делать из bash, а не писать страницу, чтобы использовать javascript, который может делать это по запросу/на лету? Это должно вас происходит http://www.egrappler.com/jquery-broken-link-checker-plugin-jslink/

, но я думаю, что это было бы возможно создать подобную логику по своему усмотрению с JQuery $ .get/$ .load методы

0

Не вполне уместна задача для Bash.

  • Вариант 1: Я хотел бы использовать Java или Groovy, есть обработчик SAX просто сбросить все данные для вывода, для <a> элементов, для которых он будет проверять значение href за исключением, и если нарушена, добавьте class="broken" часть.

  • Вариант 2: Имейте XSLT, который будет называть пользовательскую функцию XSLT на <a> элементах. Опять же, я бы сделал это с Java, но любой язык с хорошим движком XSLT может это сделать.

  • Вариант 3: Если вы действительно хотите, чтобы чувствовать себя вызывающим ;-) вот линия, чтобы получить достаточно ненадежные проверки ссылок на Bash:


grep -R '(?:href="(http://[^"]+)")' -ohPI | grep -oP 'http://[^"]+' | sort | uniq | wget -nv -S -O /dev/null -i - 2>&1 | grep -P '(wget:| -> |HTTP/|Location:)' 

Это, вероятно, может стать лучше, но Я был в порядке с этим.

  • Вариант 4: Можно использовать curl -L ... (-L следует редирект) вместо wget.

grep -R '(?:"(http://[^"]+)")' -ohPI | grep -v search.maven.org | grep -oP 'http://[^"]+' | sort | uniq | xargs -I{} sh -c 'echo && echo "$1" && curl -i -I -L -m 5 -s -S "$1"' -- {} 2>&1 | grep -P '(^$|curl:|HTTP/|http://|https://|Location:)' 

Pro совет: curl кажется, больше сценариев дружественного выхода, так что вы можете сделать это параллельно ускорить: ... | xargs -n 1 -P 8 curl -L ... Это будет работать 8 процессов curl и передать один аргумент (URL) вовремя. Сортировка вывода зависит от вас, я бы, вероятно, создавал один файл для каждого вызова curl, а затем конкатенировал.

Смежные вопросы