Wget заголовок страницы - PullRequest
2 голосов
/ 16 февраля 2012

Можно ли получить заголовок страницы из командной строки?

ввод:

$ wget http://bit.ly/rQyhG5 <<code>>

выход:

If it’s broke, fix it right   - Keeping it Real Estate. Home

Ответы [ 2 ]

7 голосов
/ 16 февраля 2012

Этот скрипт даст вам то, что вам нужно:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | sed -n -e 's!.*<title>\(.*\)</title>.*!\1!p'

Но есть много ситуаций, когда он ломается, в том числе, если в теле страницы есть <title>...</title>, или если заголовокнаходится на более чем одной строке.

Это может быть немного лучше:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | paste -s -d " "  \
  | sed -e 's!.*<head>\(.*\)</head>.*!\1!' \
  | sed -e 's!.*<title>\(.*\)</title>.*!\1!'

, но это не соответствует вашему случаю, так как ваша страница содержит следующее открытие заголовка:

<head profile="http://gmpg.org/xfn/11">

Опять же, это могло бы быть лучше:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | paste -s -d " "  \
  | sed -e 's!.*<head[^>]*>\(.*\)</head>.*!\1!' \
  | sed -e 's!.*<title>\(.*\)</title>.*!\1!'

, но есть еще способы сломать его, включая отсутствие заголовка / заголовка на странице.

Опять же, лучшее решение можетбыть:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | paste -s -d " "  \
  | sed -n -e 's!.*<head[^>]*>\(.*\)</head>.*!\1!p' \
  | sed -n -e 's!.*<title>\(.*\)</title>.*!\1!p'

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

paste и 2 sed могут бытьобъединены в один сед, но менее читабельны.Однако эта версия имеет преимущество работы с многострочными заголовками:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;T;s!.*<title>\(.*\)</title>.*!\1!p}'

Обновление :

Как поясняется в комментариях, в последнем приведенном выше седе используетсяT команда, которая является расширением GNU.Если у вас нет совместимой версии, вы можете использовать:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;tnext;b;:next;s!.*<title>\(.*\)</title>.*!\1!p}'

Обновление 2 :

Как указано выше, все еще не работает на Mac, попробуйте:

wget --quiet -O - http://bit.ly/rQyhG5 \
  | sed -n -e 'H;${x;s!.*<head[^>]*>\(.*\)</head>.*!\1!;tnext};b;:next;s!.*<title>\(.*\)</title>.*!\1!p'

и / или

cat << EOF > script
H
\$x
\$s!.*<head[^>]*>\(.*\)</head>.*!\1!
\$tnext
b
:next
s!.*<title>\(.*\)</title>.*!\1!p
EOF
wget --quiet -O - http://bit.ly/rQyhG5 \
  | sed -n -f script

(обратите внимание на \ перед $, чтобы избежать переменного расширения.)

Появляется, что :next ненапример, префикс $, что может быть проблемой в некоторых версиях sed.

0 голосов
/ 29 января 2015

Следующее извлечет из того, что рысь считает заголовком страницы, избавляя вас от всей бессмыслицы регулярных выражений.Предполагая, что страница, которую вы извлекаете, соответствует стандартам для lynx, это не должно нарушаться.

lynx -dump example.com | sed '2q;d'
...