2011-02-25 136 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') 可以让您检索小图标或大图标,就像处理文件/文件夹/外壳项目一样。

延斯;)