如何用Java解析Google Chrome和Mozilla Firefox中导出的书签文件。是否有任何库可以直接解析它们并获取其中的URL。
另外,欢迎使用Java解析它们的示例代码。
答案 0 :(得分:7)
在大多数情况下,您实际上不需要解析HTML文件。 Chrome将书签存储在JSON文件中。使用JSON解析器读取该文件要简单得多。
您感兴趣的文件位于(在Linux上,无论如何,谷歌周围的其他操作系统):
/home/your_name/.config/google-chrome/Default/Bookmarks
JSON解析很简单。 Google周围或以How to parse JSON in Java开头。
如果您想在开始挖掘之前可视化JSON数据,那么还要查看http://chris.photobooks.com/json/default.htm。
答案 1 :(得分:3)
根据发布的新评论,解决方案是使用JSOUP开源程序来执行此操作。 JSOUP只接受HTTP或HTTPS协议,因此您可能希望在tomcat等本地服务器上托管导出的书签HTML并获取它的DOM
http://yourip:<port>/<yourProject>/<bookmark.html>.
JSOUP非常明显。
其他更简单的方法:
Chrome和Firefox书签存储为JSON,如下所示。
Java方式:我建议您使用JSON来解析这些。基于以下结构创建引用Java Object。
或只是使用UNIX命令提示符并执行
grep -i "url" <bookmark file path> | cut -d":" -f2
但是,如果您仍然对使用Chrome API感兴趣,请访问:http://developer.chrome.com/extensions/bookmarks.html
{
"checksum": "702d8e600a3d70beccfc78e82ca7caba",
"roots": {
"bookmark_bar": {
"children": [ {
"date_added": "12939920104154671",
"id": "3",
"name": "Development/Tutorials/Git/git-svn - KDE TechBase",
"type": "url",
"url": "http://techbase.kde.org/Development/Tutorials/Git/git-svn"
}, {
"date_added": "12939995405838705",
"id": "4",
"name": "QJson - Usage",
"type": "url",
"url": "http://qjson.sourceforge.net/usage.html"
答案 2 :(得分:0)
我对这个问题有点迟了。但是,如果它仍然有意义:我需要做同样的事情(以及其他书签资源:GitHub Stars,Netscape和Google书签)并构建自己的。您可以从我的仓库https://github.com/IvoLimmen/mystart中查看并获取它。
答案 3 :(得分:0)
如果有人感兴趣:以下是有关如何解决解析Chrome书签JSON文件(不过尚未完全测试,仅是为了弄清主意)的简要说明:
import org.json4s.DefaultFormats
import org.json4s.native.JsonMethods
import org.junit.Test
class BookmarksImporterTest {
implicit val formats: DefaultFormats.type = DefaultFormats
def analyse(element: Node): List[Node] = {
element.children.flatMap(c => {
c.`type` match {
case Some("folder") => c.children.flatMap(r => analyse(r))
case Some("url") => List(c)
case _ => println("???"); List()
}
})
}
@Test
def test(): Unit = {
val source = scala.io.Source.fromFile("bookmarks.json")
val json = JsonMethods.parse(source.reader())
val bookmarks = json.extract[ChromeBookmarks]
val bms = bookmarks.roots.flatMap {
case (name, elements) => analyse(elements)
}
println("found " + bms.size + " entries")
}
}
case class ChromeBookmarks(checksum: String, roots: Map[String, Node], version: Int)
case class Node(
id: Option[String],
name: Option[String],
url: Option[String],
children: List[Node],
`date-added`: Option[Long],
`date-modified`: Option[Long],
`type`: Option[String]
)