2011-02-25 69 views
68

足夠簡單的問題:我創建了一個小應用程序,它基本上只是一個位於我的系統托盤中的收藏夾,這樣我就可以從同一個地方打開經常使用的站點/文件夾/文件。從我的系統獲取已知文件類型的默認圖標並不複雜,但我不知道如何從網站獲取圖標。 (SO在地址欄中有灰色 - >橙色堆棧圖標)如何獲取網站的圖標?

有人知道我會怎麼做嗎?

回答

154

你要解決這幾個方面:

  1. 外觀爲favicon.ico在域的根

    www.domain.com/favicon.ico

  2. 尋找一個<link>標籤與rel="shortcut icon"屬性

    <link rel="shortcut icon" href="/favicon.ico" />

  3. 查找一個<link>標籤與rel="icon"屬性

    <link rel="icon" href="/favicon.png" />

後兩者通常會產生較高質量的圖像。


只是爲了涵蓋所有的基礎的,也有因爲這些設備通常有設備不是瀏覽器上的大圖標就需要有可能生成更高質量的影像設備特定的圖標文件:

<link rel="apple-touch-icon" href="images/touch.png" />

<link rel="apple-touch-icon-precomposed" href="images/touch.png" />


並下載圖標而無需關心什麼圖標就可以使用AU像http://www.google.com/s2/favicons這將完成所有的繁重工作:

var client = new System.Net.WebClient(); 

client.DownloadFile(
    @"http://www.google.com/s2/favicons?domain=stackoverflow.com", 
    "stackoverflow.com.ico"); 

希望幫助!

+1

確實GetFavIcon仍然有效嗎?當我運行你的例子時,我得到一個400錯誤 – Julien 2015-04-19 15:43:14

+7

看起來像谷歌現在有一個類似的服務:http://www.google.com/s2/favicons?domain_url=stackoverflow.com – hunter 2015-05-08 19:49:56

+5

如果有人想要一個替代谷歌,DuckDuckGo有另一種解決方案:http://icons.duckduckgo.com/ip2/www.stackoverflow.com.ico – 2016-07-10 00:51:58

5

首先要查找的是網站根目錄中的/favicon.ico;像WebClient.DownloadFile()應該沒問題。不過,您也可以設置在元數據中的圖標 - 那麼這就是:

<link rel="shortcut icon" 
    href="http://sstatic.net/stackoverflow/img/favicon.ico"> 

,並注意備用圖標可能可用;在「觸摸」人們往往更大和更高的水庫,例如:

<link rel="apple-touch-icon" 
    href="http://sstatic.net/stackoverflow/img/apple-touch-icon.png"> 

所以你解析無論是在HTML敏捷性包或XmlDocument的(如XHTML),並使用Web客戶端。DownloadFile()

下面是一些代碼,我通過使用敏捷包來獲得這樣的:

var favicon = "/favicon.ico"; 
var el=root.SelectSingleNode("/html/head/link[@rel='shortcut icon' and @href]"); 
if (el != null) favicon = el.Attributes["href"].Value; 

注意的圖標是他們的,不是你的。

+1

謝謝馬克。我很欣賞這個例子。關於這些圖像,我不打算修改它們,或者將它們用於除快捷方式標籤旁邊的上下文菜單中的圖標之外的其他任何內容。 – 2011-02-25 15:43:05

3

喲可以從網站的HTML中獲取圖標網址。

這裏是圖標標籤:

<link rel="icon" type="image/png" href="/someimage.png" /> 

你應該在這裏使用正則表達式。如果未找到標籤,請在網站根目錄中查找「favicon.ico」。如果沒有發現,該網站沒有favicon。

2
 HttpWebRequest w = (HttpWebRequest)HttpWebRequest.Create("http://stackoverflow.com/favicon.ico"); 

     w.AllowAutoRedirect = true; 

     HttpWebResponse r = (HttpWebResponse)w.GetResponse(); 

     System.Drawing.Image ico; 
     using (Stream s = r.GetResponseStream()) 
     { 
      ico = System.Drawing.Image.FromStream(s); 
     } 

     ico.Save("favicon.ico"); 
10

這裏有2個選項,我測試了100個網址,並得到了不同的結果,每個選項。 請注意,這個解決方案不是c#,但c#可能不是必需的。

<img height="16" width="16" src='http://grabicon.com/edocuments.co.uk' /> 

<img height="16" width="16" src='http://www.google.com/s2/favicons?domain=www.edocuments.co.uk' /> 
+3

grabicon.com現在支付服務從$ 9 /月開始 – janot 2016-02-19 18:07:47

+1

另一種:http://favicon.allesedv.com/ 2016-08-09 14:56:04

1

這是一個很晚的答案,但爲了完整性:即使接近90%的提取所有的圖標也很困難。

前段時間我寫了一個WordPress插件:http://wordpress.org/extend/plugins/wp-favicons/,它試圖靠近。

a。它開始通過查看favicon存儲庫,如谷歌圖標,getfavicons等...

b。如果他們都沒有返回一個圖標(我通過與他們返回的默認圖標匹配來檢查該圖標) 我開始嘗試自己獲取圖標

c。這涉及遍歷頁面,但也檢查沒有autoredirect的重定向以及404遍歷,因爲在404上也可能存在圖標。最後,這意味着你將不得不解析html頭中的重定向以及javascript重定向以更接近於100%。之後,我做了一些檢查的物理圖像文件,因爲有時也在某些服務器上(我測試300.000 +)文件返回與不正確的MIME類型等。

代碼仍然不完美,因爲在細節它變得瘋狂,你會發現很多奇怪的情況:人們錯誤地編碼路徑(img/favicon.ico,其中img不在根目錄中),在html輸出中重複標題,從頭部和身體等不同服務器響應...

的抓取部分的核心是在這裏:http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/server/class-http.php所以你可以反向工程,但要注意驗證響應確實應該做(檢查圖像文件類型,MIME等)

2

你可以不用編程。只需打開網站,右鍵單擊並選擇「查看源代碼」即可打開該網站的HTML代碼。然後在文本編輯器中搜索「圖標」 - 它會指引你的東西看起來像

<link rel="icon" href='/SOMERELATIVEPATH/favicon.ico' type="image/x-icon" /> 

採取href的字符串,並將其添加到Web站點的基本URL(假設它是"http://WEBSITE/")所以它看起來像

http://WEBSITE/SOMERELATIVEPATH/favicon.ico

這是favicon的絕對路徑。如果你沒有這樣找到它,那麼在這種情況下URL可以是http://WEBSITE/favicon.ico

採取URL你下定決心,並將其插入下面的代碼:

<html> 
    <head> 
    <title>Capture Favicon</title> 
    </head> 
    <body> 
    <a href='http://WEBSITE/SOMERELATIVEPATH/favicon.ico' alt="Favicon"/>Favicon</a> 
    </body> 
</html> 

保存此HTML代碼在本地(例如在桌面上)爲GetFavicon.html並在其上,然後雙擊打開它。它將僅顯示名爲Favicon的鏈接。右鍵點擊此鏈接,然後選擇「將目標另存爲...」將Favicon保存到您的本地PC - 即完成!

0

您可以使用Getfv.co

To retrieve a favicon you can hotlink it at... http://g.etfv.co/[URL]

舉例此頁:http://g.etfv.co/https://stackoverflow.com/questions/5119041/how-can-i-get-a-web-sites-favicon

下載內容,讓我們開始吧!

編輯:

Getfv.co和fvicon.com看死了。如果你想我找到一個非自由的選擇:grabicon.com

+1

鏈接已死,錯誤:未找到 – tttony 2015-12-30 18:04:21

+0

@tttony確實。 fvicon.com也看起來死了。我將用付費內容編輯我的評論。如果您發現可用的免費鏈接,請分享! – aloisdg 2016-01-03 09:34:21

1

我發現「SHGetFileInfo」(簽名爲'www.pinvoke.net') 可以讓您檢索小圖標或大圖標,就像處理文件/文件夾/外殼項目一樣。

延斯;)