Wget页面标题

Mr.*_*ael 2 shell wget

是否可以从命令行Wget页面的标题?

输入:

$ wget http://bit.ly/rQyhG5 <<code>>
Run Code Online (Sandbox Code Playgroud)

输出:

If it’s broke, fix it right   - Keeping it Real Estate. Home
Run Code Online (Sandbox Code Playgroud)

jfg*_*956 8

这个脚本可以满足您的需求:

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

但是在很多情况下它会中断,包括<title>...</title>页面正文中是否存在,或者标题是否在多行上.

这可能会好一些:

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

但它不适合您的情况,因为您的页面包含以下开头:

<head profile="http://gmpg.org/xfn/11">
Run Code Online (Sandbox Code Playgroud)

再次,这可能会更好:

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

但仍然有办法打破它,包括页面中没有头/标题.

同样,更好的解决方案可能是:

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'
Run Code Online (Sandbox Code Playgroud)

但我相信我们可以找到一种方法来打破它.这就是为什么一个真正的xml解析器是正确的解决方案,但是当你的问题被标记时shell,上面的它是我能带来的最好的.

paste和2 sed可以在单个SED被合并,但不太可读.但是,这个版本具有处理多行标题的优势:

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

更新:

正如在注释中解释的那样,上面的最后一个sed使用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}'
Run Code Online (Sandbox Code Playgroud)

更新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'
Run Code Online (Sandbox Code Playgroud)

和/或

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
Run Code Online (Sandbox Code Playgroud)

(注意\以前$要避免变量扩展.)

它接缝:next不喜欢以a为前缀$,这在一些sed版本中可能是一个问题.