Android App使用Jsoup抓取网页数据显示

学习Jsoup可以到:http://www.open-open.com/jsoup/parsing-a-document.htm了解下什么是Jsoup,有什么作用。

使用Jsoup需要用到的浏览器是:google Chrome,看以下两张图就明白为什么要使用google Chrome

这是一个新闻网站上的页面,使用google Chrome打开,然后按键盘上的F12(当然也可以右键“查看网页源代码”查看,但没有F12直观),就出现右边部分,在右边最上方可以看到Elements;点击相应的标签,看到左边会相应选中,在右边下方可以看到selector,可以类似于CSS或jQuery的语法来查找和操作元素

以上信息在程序中如何获取?可以看以下代码

/**
	 * 根据文章的url返回一个NewsDto对象
	 * 
	 * @return
	 * @throws CommonException
	 */
	public NewsDto getNews(String urlStr) throws CommonException {
		NewsDto newsDto = new NewsDto();
		List<News> newses = new ArrayList<News>();
		// String htmlStr = DataUtil.doGet(urlStr);

		// Document doc = Jsoup.parse(htmlStr);
		Document doc = jsoupConnect(urlStr);
		if (doc == null)
			return newsDto;
		// FileUtil.writeSDcard("ccc.html", doc.toString());
		Elements aas = doc.select("div.content-box.clear");
		if (aas == null || aas.size() == 0) {
			aas = doc.select("div#contentA.area");
			if (aas == null || aas.size() == 0) {
				aas = doc.select("div.layout-c-2-1");
				// 其它情况暂时不支持 2015.09.22
				if (aas == null || aas.size() == 0) {
					return newsDto;
				}
				Element titleEle = aas.select("h1.article-title").get(0);
				getTitle(newses, titleEle);

				// 内容
				Element contentsEle = aas.select("div.article-description")
						.get(0);
				Element desEle = contentsEle.getElementsByTag("p").get(0);
				List<TextNode> lists = desEle.textNodes();
				for (TextNode node : lists) {
					//LogUtils.i("node = " + node.toString());
					if (!node.toString().trim().equals("")) {
						getContent(newses, node);
					}
				}

				Element child = desEle.getElementsByTag("a").get(0);
				getTextLink(newses, child);

				newsDto.setNewses(newses);
				return newsDto;
			}
			Element titleEle = aas.select("em.ttl").get(0);
			// 标题
			getTitle(newses, titleEle);

			Elements bodyEle = aas.select("div.mainFrame");
			// 图片
			Elements imgs = bodyEle.get(0).getElementsByTag("img");
			for (Element img : imgs) {
				getImgLink(newses, img);
			}
			imgs.remove();

			// 内容
			Elements contentsEle = aas.select("p.explain");
			for (Element child : contentsEle) {
				getContent(newses, child);
			}

			newsDto.setNewses(newses);
			return newsDto;
		}
		Element titleEle = aas.select("h1").get(0);
		getTitle(newses, titleEle);

		Elements bodyEle = aas.select("div#contentText.text.clear");
		// 图片
		Elements imgs = bodyEle.get(0).getElementsByTag("img");
		for (Element img : imgs) {
			getImgLink(newses, img);
		}
		imgs.remove();
		// 内容
		Elements contentsEle = bodyEle.select("p");
		LogUtils.i("contentsEle.size() = " + contentsEle.size());
		if (contentsEle == null || contentsEle.size() == 0) {
			contentsEle = bodyEle.select("div");
			LogUtils.i("size = " + contentsEle.size());
			for (Element child : contentsEle) {
				getContent(newses, child);
				LogUtils.i("bodyEle text = " + child.text());
			}
		} else {
			for (Element child : contentsEle) {
				getContent(newses, child);
			}
		}

		newsDto.setNewses(newses);
		return newsDto;
	}

	private Document jsoupConnect(String urlStr) {
		
		Document doc = null;
		try {
			doc = Jsoup.connect(urlStr).userAgent("Mozilla").timeout(50000)
					.get();
//			doc = Jsoup.connect(urlStr)
//					  .data("query", "Java")
//					  .userAgent("Mozilla")
//					  .cookie("auth", "token")
//					  .timeout(3000)
//					  .post();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return doc;
	}

	private void getContent(List<News> newses, TextNode node) {
		News news = new News();
		news.setType(NewsType.CONTENT);
		news.setContent(node.toString());
		newses.add(news);
	}

	private void getTitle(List<News> newses, Element titleEle) {
		News news = new News();
		news.setTitle(titleEle.text());
		news.setType(NewsType.TITLE);
		newses.add(news);
	}

	private void getImgLink(List<News> newses, Element img) {
		News news = new News();
		news.setImageDes(img.attr("alt"));
		news.setImageLink(img.attr("src"));
		newses.add(news);
	}

	private void getTextLink(List<News> newses, Element child) {
		String link = child.attr("abs:href"); // 文字的链接
		News news = new News();
		news.setTextLink(link);
		news.setContent(child.text());
		newses.add(news);
	}

	private void getContent(List<News> newses, Element child) {
		News news = new News();
		Elements strongs = child.select("strong");
		String content = child.text();
		news.setType(NewsType.CONTENT);
		news.setContent(content);
		for (Element strong : strongs) {
			news.setType(NewsType.BOLD_TITLE);
			break;
		}
		newses.add(news);
	}


所有的代码可以到:http://pan.baidu.com/s/1i3KYTMX下载



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值