2012-02-16 8 views
2

コマンドラインからページのタイトルをWgetすることは可能ですか?Wgetページタイトル

入力:

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

出力:

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

取得したhtmlを解析し、htmlヘッドタイトルのテキストコンテンツを抽出する必要があります。そして正気のために、これに対して正規表現を使用しようとしないでください。 –

答えて

5

このスクリプトは、あなたが必要なものを与えるだろう:

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は、1つのsedでマージできますが、読みにくくなります。更新

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

:しかし、このバージョンは、複数行のタイトルに取り組んでの利点を持っている

としては、上記のsed最後はGNUの拡張であるTコマンドを使用して、コメントで説明しています。あなたは互換性のあるバージョンを持っていない場合は、使用することができます。

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

素晴らしいよ!しかし、最後の解決策を試してみたところ、 'sed:1:" H; $ {x; s!。* * * \(... "):無効なコマンドコードT'をエラーとして返します –

+0

' T' isあなたはLinux以外の何かでスクリプトを実行している可能性があります。この場合、 '; t;'; tnext; b;:next;を変更することができます。 – jfg956

+0

anotherエラー: 'sed:2:" H; $ {x; s!。* ] *> \(... "予期せぬEOF(保留中))' OSXを実行していますが、このマシンにgnu-驚くべきこと –

0

以下は、Lynxがページのタイトルと考えるものをすべて引き出し、正規表現のナンセンスからあなたを救うものです。あなたが検索しているページがlynxのために十分に標準に準拠していると仮定すれば、これは壊れてはいけません。

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