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

26 篇文章 0 订阅

转自:http://www.cnblogs.com/ydxlt/p/5030964.html

现在网络数据传输有三种常用的形式,xml,json 和 html,我们的客户端请求服务器,服务器通常给我们返回上面三种形式的数据。
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 
主要功能:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;


官网下载最新版:http://jsoup.org/download

总结一下:
jsoup解析html的步骤:

1.得到Document对象:
2.通过发送Jsoup的get或者post请求返回Document对象
3.将html字符串转换成Document对象(通过Jsoup.parse()方法):
4.使用Document.select()进行初步筛选数据
5.使用Element的一系列方法筛选出我们要的数据


注意:要对照页面源码解析,解析任何数据之前我们都得先知道要解析数据的结构,看着html页面的源码调用Document,Element等对象的相关方法怎么简单怎么解析。


下文 转自:http://blog.csdn.net/junbin_fan/article/details/24814407

一、目标主页

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


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

http://jsoup.org/apidocs/


三、源代码

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);
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值