据我所知,JxBrowser中没有网站图标的基础结构。网站图标不是标题事件的一部分吗?我想我最好的选择就是去http://<domain>/favicon.ico,但这将是多余的工作(http客户端和缓存机制)。

有什么方法可以使用JxBrowser优雅地处理它?

我尝试了两种策略来尝试可靠地获得资源,但是这还不够可靠:

基于事件的网址获取(从未看到ResourceType.FAVICON):

browser.context.networkService.resourceHandler = object : ResourceHandler {
    override fun canLoadResource(p0: ResourceParams?): Boolean {
        if (p0!!.resourceType == ResourceType.FAVICON) println(p0!!.url)
        if (p0!!.resourceType == ResourceType.IMAGE && p0.url.contains("favicon")) println("found favicon url: ${p0.url}")
        return true
    }
}

//基于xpath的方法
browser.addLoadListener(object : LoadListener {
    override fun onDocumentLoadedInMainFrame(p0: LoadEvent) {
        p0.inSwingThread {
            val res = it.browser.document.findElements(By.xpath("//link[@rel=\"icon\" or @rel=\"shortcut icon\"]"))
            res.forEach {
                println("----------")
                it.attributes.forEach { println(it.key + " " + it.value) }
            }
        }
    }
    // ...
}

最佳答案

目前,JxBrowser API不提供允许下载favicon.ico文件的功能。我建议您将标准Java API和http://<domain>/favicon.ico一起使用。例如:

URL url = new URL("http://stackoverflow.com/favicon.ico");
InputStream in = new BufferedInputStream(url.openStream());
OutputStream out = new BufferedOutputStream(new FileOutputStream("D:/favicon.ico"));
for ( int i; (i = in.read()) != -1; ) {
    out.write(i);
}
in.close();
out.close();

关于java - JxBrowser策略可有效地检索网站图标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39028025/

10-10 20:02