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的语法来查找和操作元素
以上信息在程序中如何获取?可以看以下代码
所有的代码可以到:http://pan.baidu.com/s/1i3KYTMX下载
使用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下载
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories