使用Jsoup爬虫解析html新闻的实例

时间:2022-10-31 23:14:53

一、目标主页 

实例中进行解析的的目标主页是宁夏大学新闻网,在主方法中可以看到有三条新闻详情和三个新闻列表共6条URL,可以通过在主方法中切换不的url来对目标主页的内容进行解析。

public static void main(String[] args) {// 宁大主页新闻详情String newsDetailUrl_1 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8532&cls=&scls=";String newsDetailUrl_2 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8536&cls=&scls=";String newsDetailUrl_3 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8360&cls=&scls=";// 宁大主页综合新闻列表String newsListUrl_1 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1";String newsListUrl_2 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1&layn=&pages=2";String newsListUrl_3 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1&layn=&pages=3";NewsJSoup jsSoupMain = new NewsJSoup(newsDetailUrl_1, 2);}

二、JSoup的相关API可以参看官方的支持文档。

点击打开链接

三、源代码


说明:不同的网页有不同的解析方法,具体以目标HTML源文档为准,不要尝试用这段代码解析其它的url网页。


package net;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
* @name Jsoup爬虫解析新闻
* @description 线程中根据不同的标记决定解析一条新闻还是新闻列表
* @author 樊俊彬
* @date 2014-4-29
*
*/
public class NewsJSoup implements Runnable {

public Document document;
public Elements elements;
public String newsDetailUrl;
public String newsListUrl;
public int type;

public NewsJSoup(String url, int type) {
this.type = type;

if (type == 1) {
this.newsListUrl = url;
} else {
this.newsDetailUrl = url;
}
new Thread(this, "读取这条新闻详细线程").start();
}

public void run() {
if (type == 1) {
loadNewsList();
} else {
loadNewsDetail();
}

}

/**
* 解析宁大综合新闻列表
*/
private void loadNewsList() {
try {
document = Jsoup.connect(newsListUrl).timeout(100000).get();
// 新闻源码中的表格共有28个,均没有id或class等标记,所以只能以穷举的方式来搜索目标表格(width=640)
for (int i = 0; i < 28; i++) {
Element element = document.select("table").get(i);
if (element.attr("width").toString().equals("640")) {
System.out.println(i);
}
}
// 目标表格width=240是源码中的第24个表格,加载它
Element element = document.select("table").get(24);
// <td width=500>是新闻的标题和url,<td width=80>是新闻的发表时间
Elements elements = element.getElementsByAttributeValueContaining(
"width", "500").select("a");
for (Element ele : elements) {

System.out.println("新闻标题:" + ele.attr("title"));
System.out.println("对应的URL:" + ele.attr("href"));
}

} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("爬取失败");
e.printStackTrace();
}
}

/**
* 解析一条新闻的详细
*/
private void loadNewsDetail() {
try {
document = Jsoup.connect(newsDetailUrl).timeout(100000).get();
// 新闻标题的源码和解析
elements = document.getElementsByClass("TitleDisplay");
System.out.println(elements.toString());
System.out.println("\n" + "解析到的新闻标题:" + "\n"
+ elements.select("strong").text().toString() + "\n");

// 新闻发布信息的源码和解析
elements = document.getElementsByClass("TitleDisplay2");
System.out.println(elements.toString());
System.out.println("\n" + "解析到的新闻发布信息:" + "\n"
+ elements.select("td").get(0).text().toString() + "\n");

// 新闻正文的源码和解析
elements = document.getElementsByClass("ContentDisplay");
System.out.println(elements.toString());
System.out.println("\n" + "解析到的新闻正文:" + "\n"
+ elements.select("p").toString() + "\n");

} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("爬取失败");
e.printStackTrace();
}
}

public static void main(String[] args) {
// 宁大主页新闻详情
String newsDetailUrl_1 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8532&cls=&scls=";
String newsDetailUrl_2 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8536&cls=&scls=";
String newsDetailUrl_3 = "http://news.nxu.edu.cn/ndnews_content_disp.asp?xid=8360&cls=&scls=";

// 宁大主页综合新闻列表
String newsListUrl_1 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1";
String newsListUrl_2 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1&layn=&pages=2";
String newsListUrl_3 = "http://news.nxu.edu.cn/ndnews_content_brows.asp?cls=2&scls=1&layn=&pages=3";

NewsJSoup jsSoupMain = new NewsJSoup(newsListUrl_1, 1);
}

}


四、调试前必须先导入JSoup包,官方最新为JSoup 1.7.3,可在官方下载。调试时保持网络畅通。

实在搞不定的话可以联系我,QQ :398131837。