Jsoup是一个开源的DOM解析器,只要熟悉html和css一点知识,就知道怎么用,今天的例子是使用jsoup解析一个图片网站,然后输出一组图片的“缓存地址”,“真实地址”,“分辨率”的内容。在开始前,要先回顾一下基础知识。
这样,你就得到了DOM文档,解析前我们要想一想“解析后的图片”怎么放,我的方法是放到map里面,然后再放到list里面,这个用于以后写ListView
现在开始解析html,打开“审查元素”,我们发现要解析的是 <ul> <li/> .....<li/> </ul>的内容,如图
- Jsoup的基本教程:http://jsoup.org/ ,下载导入即可,注意要记得抛出异常,我认为其中最重要的就是select的功能了
- CSS基础,其实我们只要知道这3个就可以了,class 对应的是 “.class”,id对应的是“#id”,tag对应的是"h1","p"等,这个可以用chrome的F12功能去实现
- http get的querystring的基础,这个在图片网站,图书馆等检索平台上都有很大的用处,这个同样可以用chrome的F12实现
以上3点,最好上w3cschool看一下,要不然没有底子,下面的也看不懂.现在开始具体的步骤。
首先,你要有个能解析的网页,我挑选了一个简单的网页:“http://konachan.com/post?page=4&tags=hentai_ouji_to_warawanai_neko”,其中“http://konachan.com/post”这个是基础的网页,然后“?page=4&tags=hentai_ouji_to_warawanai_neko”是querystring,在chrome F12,打开审查元素,选择Network,里面有详细的介绍,所以,代码这个写:
//eg, http get is :http://konachan.com/post?page=4&tags=hentai_ouji_to_warawanai_neko
final String BASEURL = "http://konachan.com/post";
//TODO: set your own QUERY
final String TAGS = "tags";
final String PAGE = "page";
String currentPage = "2";
String currentTAGS = "hentai_ouji_to_warawanai_neko";
try {
Document document = Jsoup.connect(BASEURL)
.timeout(10000)
//?page=4&tags=hentai_ouji_to_warawanai_neko
.data(PAGE,currentPage,TAGS,currentTAGS)
.get();
.......
这样,你就得到了DOM文档,解析前我们要想一想“解析后的图片”怎么放,我的方法是放到map里面,然后再放到list里面,这个用于以后写ListView
List<Map<String,String>> imgs = new ArrayList<Map<String, String>>();
Map<String,String> img = new HashMap<String, String>();
现在开始解析html,打开“审查元素”,我们发现要解析的是 <ul> <li/> .....<li/> </ul>的内容,如图
而展开了li,发现就是具体的每个图片对象了,所以,我们先搞到li对象
Elements lis = document.select("ul#post-list-posts li");
我们获得实质就是List<Element> 集合,通过这一步,我们得到一个List,它有15个元素,接下来,对每个元素进行解析,存放到map对象即可,只是些基础知识了
for (int i = 0; i < lis.size(); i++) {
Element imgpreview = lis.select("img.preview").get(i);
Element largeimg = lis.select("a.directlink").get(i);
Element resolution = lis.select("span.directlink-info").get(i);
System.out.println(i + " imgpreview.attr(\"src\") = " + imgpreview.attr("src"));
System.out.println("largeimg.attr(\"href\") = " + largeimg.attr("href"));
System.out.println("resolution.text() = " + resolution.text());
img.put("thumbimg",imgpreview.attr("src"));
img.put("largeimg",largeimg.attr("href"));
img.put("resolution",resolution.text());
//TODO:to be uesd in ListView
imgs.add(i,img);
}
最后贴上完整代码:
/*
* Copyright (c) 2014.
* Author : leon
* Feel free to ues it!
*/
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main
{
public static void main(String args[])
{
//eg, http get is :http://konachan.com/post?page=4&tags=hentai_ouji_to_warawanai_neko
final String BASEURL = "http://konachan.com/post";
//TODO: set your own QUERY
final String TAGS = "tags";
final String PAGE = "page";
String currentPage = "2";
String currentTAGS = "hentai_ouji_to_warawanai_neko";
try {
Document document = Jsoup.connect(BASEURL)
.timeout(10000)
//?page=4&tags=hentai_ouji_to_warawanai_neko
.data(PAGE,currentPage,TAGS,currentTAGS)
.get();
List<Map<String,String>> imgs = new ArrayList<Map<String, String>>();
Map<String,String> img = new HashMap<String, String>();
Elements lis = document.select("ul#post-list-posts li");
System.out.println("lis.size() = " + lis.size());
for (int i = 0; i < lis.size(); i++) {
Element imgpreview = lis.select("img.preview").get(i);
Element largeimg = lis.select("a.directlink").get(i);
Element resolution = lis.select("span.directlink-info").get(i);
System.out.println(i + " imgpreview.attr(\"src\") = " + imgpreview.attr("src"));
System.out.println("largeimg.attr(\"href\") = " + largeimg.attr("href"));
System.out.println("resolution.text() = " + resolution.text());
img.put("thumbimg",imgpreview.attr("src"));
img.put("largeimg",largeimg.attr("href"));
img.put("resolution",resolution.text());
//TODO:to be uesd in ListView
imgs.add(i,img);
}
} catch (Exception e){
e.printStackTrace();
}
}
}