您的位置:首页 > 移动开发 > Android开发

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

2015-10-08 15:26 781 查看
学习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下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息