如何使用XSLT或JSP检索网站的favicon?

如何使用XSLT或JSP检索网站的favicon?,jsp,web,xslt,favicon,Jsp,Web,Xslt,Favicon,我想在我的网站上列出特色网站,我认为尊重和使用他们的favicon会很酷。如何从JSP或XSLT中任意URL的域中获取它?我可以使用PHP或javascript,但XSLT是首选方法。要获得网站的外观,您需要加载每个特色网站的索引HTML并检查以下任一项: HTML: XHTML: Internet Explorer可能使用稍有不同的格式: 还请注意,由于大多数web浏览器不需要HTML链接来检索favicon,如果未找到上述链接引用,则还应检查网站文档根目录中的favicon.ic

我想在我的网站上列出特色网站,我认为尊重和使用他们的favicon会很酷。如何从JSP或XSLT中任意URL的域中获取它?我可以使用PHP或javascript,但XSLT是首选方法。

要获得网站的外观,您需要加载每个特色网站的索引HTML并检查以下任一项:

HTML:


XHTML:


Internet Explorer可能使用稍有不同的格式:


还请注意,由于大多数web浏览器不需要HTML链接来检索favicon,如果未找到上述链接引用,则还应检查网站文档根目录中的
favicon.ico

使用PHP,可以通过以下方式轻松获取网页的HTML内容:

$url='1!'http://www.exmaple.com';
$output=file\u get\u contents($url);

您也可以简单地执行此操作


以下是我的尝试。它使用各种策略来解决许多可能的情况:

<?
/*
  nws-favicon : Get site's favicon using various strategies

  This script is part of NWS
  https://github.com/xaccrocheur/nws/

*/


function CheckImageExists($imgUrl) {
    if (@GetImageSize($imgUrl)) {
        return true;
    } else {
        return false;
    };
};

function getFavicon ($url) {

$fallback_favicon = "/var/www/favicon.ico";    
// $fallback_favicon = "http://stackoverflow.com/favicon.ico";


    $dom = new DOMDocument();
    @$dom->loadHTML($url);
    $links = $dom->getElementsByTagName('link');
    $l = $links->length;
    $favicon = "/favicon.ico";
    for( $i=0; $i<$l; $i++) {
        $item = $links->item($i);
        if( strcasecmp($item->getAttribute("rel"),"shortcut icon") === 0) {
            $favicon = $item->getAttribute("href");
            break;
        }
    }

    $u = parse_url($url);

    $subs = explode( '.', $u['host']);
    $domain = $subs[count($subs) -2].'.'.$subs[count($subs) -1];

    $file = "http://".$domain."/favicon.ico";
    $file_headers = @get_headers($file);

    if($file_headers[0] == 'HTTP/1.1 404 Not Found' || $file_headers[0] == 'HTTP/1.1 404 NOT FOUND' || $file_headers[0] == 'HTTP/1.1 301 Moved Permanently') {

        $fileContent = @file_get_contents("http://".$domain);

        $dom = @DOMDocument::loadHTML($fileContent);
        $xpath = new DOMXpath($dom);

        $elements = $xpath->query("head/link//@href");

        $hrefs = array();

        foreach ($elements as $link) {
            $hrefs[] = $link->value;
        }

        $found_favicon = array();
        foreach ( $hrefs as $key => $value ) {
            if( substr_count($value, 'favicon.ico') > 0 ) {
                $found_favicon[] = $value;
                $icon_key = $key;
            }
        }

        $found_http = array();
        foreach ( $found_favicon as $key => $value ) {
            if( substr_count($value, 'http') > 0 ) {
                $found_http[] = $value;
                $favicon = $hrefs[$icon_key];
                $method = "xpath";
            } else {
                $favicon = $domain.$hrefs[$icon_key];
                if (substr($favicon, 0, 4) != 'http') {
                    $favicon = 'http://' . $favicon;
                    $method = "xpath+http";
                }
            }
        }

        if (isset($favicon)) {
            if (!CheckImageExists($favicon)) {
                $favicon = $fallback_favicon;
                $method = "fallback";
            }
        } else {
            $favicon = $fallback_favicon;
            $method = "fallback";
        }

    } else {
        $favicon = $file;
        $method = "classic";

        if (!CheckImageExists($file)) {
            $favicon = $fallback_favicon;
            $method = "fallback";
        }

    }
    return $favicon;
}

?>
您可以使用Firefox的
。加载网站,然后按F10>…>“在自己的窗口中打开HttpFox”,然后查找“图像/x图标”;在右边的列中是URL。

打开页面源代码(右键单击查看页面源代码)找到下面提到的行,单击images/favicon.png链接

<link rel="icon" href="images/favicon.png" type="image/png" sizes="16x16">

  • 使用IE,为站点添加书签

  • 将快捷方式从书签菜单拖到桌面上

  • 使用(真实)文本编辑器打开生成的.URL

  • 文件中将有一行用于IconFile,该行将指向 到web服务器上的favicon文件

  • 浏览到文件。。。中提琴


好极了!谢谢你提供的细节,丹尼尔。我将查看PHP教程,让您知道它是如何工作的。但是,在这种情况下,您没有做这项工作。谷歌有。16x16px是可怕的质量。有没有办法得到一个32x32?要得到一个favicon可以使用这个:尼斯。但是,我试着在favicon上添加了很多URL,但它似乎并没有得到应有的效果;我的最新版本在这里:很好,很有趣,你选择了js方法。我用PHP拼凑了一个快速而肮脏的解决方案。我更喜欢PHP,因为它允许我轻松缓存结果。