2012-02-16 99 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標題的文本內容。爲了理智,不要嘗試爲此使用正則表達式。 – 2012-02-16 13:33:26

回答

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可以合併成一個sed,但可讀性較差。然而,這個版本對多行標題的工作的優勢:

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

更新

正如在評論中解釋,上述最後的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}' 

更新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'作爲錯誤 – 2012-02-16 17:27:44

+0

'T'是一個用於sed的GNU擴展你可能正在Linux上運行腳本,在這種情況下,你可以通過'; tnext; b;:next;'來更改'; T;'我將更新答案。 – jfg956 2012-02-16 17:31:24

+0

另一個error:'sed:2:「H; $ {x; s!。* ] *> \(...」:意想不到的EOF(正在執行)')運行OSX,但是我在這臺機器上釀造了gnu-sed ,那麼令人驚訝 – 2012-02-16 17:40:31

0

以下將拉動任何l thinks認爲頁面的標題,從所有的正則表達式廢話中拯救你。假設你正在檢索的頁面是符合標準的l enough,這不應該中斷。

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