使用Jsoup函数包抓取网页内容

时间:2022-11-18 15:01:41

之前写过一篇用Java抓取网页内容的文章,当时是用url.openStream()函数创建一个流,然后用BufferedReader把这个inputstream读取进来。抓取的结果是一整个字符串。如果要提取网页中的某个元素或者链接,还需要用正则表达式来查找匹配。
最近看到利用Jsoup库函数可以方便的分析html文件。函数库本身很小,不到2Mb,本领却很大。先用url创建一个Document类的对象,再按照css的格式把链接、图片、文本一一分解出来。比如,我写了一段代码把17届*委员、候补*委员、*纪委委员的百度百科词条链接都抓取到。若逐条解析这些链接,又可以提取其它信息。原代码如下:

package CPCsearch;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import BaikeCard.PersonCard; public class No17Committee { /**
* @param args
*/
private static Map<String, String> urllist = new HashMap<String, String>(); public static void setURLlist() throws IOException{
String originalurl = "http://baike.baidu.com/searchword/?word="
+"中国XX党第十七届*委员会"+"&pic=1&sug=1&enc=utf-8";
System.out.println(originalurl);
Document doc = Jsoup.connect(originalurl).get();
Element lemmacontent = doc.select("div#lemmaContent-0").first();
Elements links = lemmacontent.select("a[href]");
for(Element link:links){
if(link.text().length()<=10){
String urladdress = link.attr("abs:href");
String name = link.text();
urllist.put(name, urladdress);
}
} } public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
setURLlist();
for(Map.Entry entry:urllist.entrySet()){
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
System.out.println(urllist.size());
} }

这里是扑捉到的结果:
中国XX党第十七届*委员会委员、候补委员、第十七届*纪律检查委员会委员的百度百科页面链接:
王旭东 http://baike.baidu.com/view/34770.htm
李盛霖 http://baike.baidu.com/view/34722.htm
田成平 http://baike.baidu.com/view/34605.htm
宋秀岩 http://baike.baidu.com/view/122092.htm
胡泽君 http://baike.baidu.com/view/967656.htm
王兆国 http://baike.baidu.com/view/1844.htm
* http://baike.baidu.com/view/1860.htm
王太华 http://baike.baidu.com/view/35988.htm
迟万春 http://baike.baidu.com/view/325028.htm
* http://baike.baidu.com/view/303958.htm
王国生 http://baike.baidu.com/view/767111.htm
* http://baike.baidu.com/view/159348.htm
张庆伟 http://baike.baidu.com/view/117230.htm
袁家军 http://baike.baidu.com/view/51855.htm
徐绍史 http://baike.baidu.com/view/924447.htm
刀林荫 http://baike.baidu.com/view/795154.htm
金振吉 http://baike.baidu.com/view/624679.htm
张平 http://baike.baidu.com/view/124481.htm
谌贻琴 http://baike.baidu.com/view/768829.htm
* http://baike.baidu.com/view/28711.htm
杨利伟 http://baike.baidu.com/view/27767.htm
靖志远 http://baike.baidu.com/view/325364.htm
孙忠同 http://baike.baidu.com/view/325023.htm
陆浩 http://baike.baidu.com/view/119638.htm
吴定富 http://baike.baidu.com/view/321120.htm
李学勇 http://baike.baidu.com/view/282960.htm
刘玉浦 http://baike.baidu.com/view/304626.htm
王宪魁 http://baike.baidu.com/view/576688.htm
陈川平 http://baike.baidu.com/view/1216672.htm
李金城 http://baike.baidu.com/view/1215488.htm
朱明国 http://baike.baidu.com/view/304539.htm
实在是因为敏感词太多了,只能放出一部分。。。