jsoup选择器来抓取网页中的数据

来源:互联网 发布:计算机二级java模拟题 编辑:程序博客网 时间:2024/05/19 23:56


JSOUP是一个没有界面的浏览器,用于分析和抓取网络html数据

使用他需要相关jar包,下载链接:http://pan.baidu.com/s/1sjuLGC1


例子:抓取http://www.ifanr.com/网页中指定规则新闻链接和标题






1.找到关键字<div class="entry-header">层下面的子标签<span>的属性数据就是想要的

try {Document doc = Jsoup.connect("http://www.ifanr.com/").get();Elements links = doc.select("div.entry-header");for (Element e : links) {Elements elements = e.select("span.number").select("a[href]");for (Element element : elements) {element.attr("href");element.attr("title").replace("Comment on ", "");getNewsDate(element.attr("href"));}}} catch (Exception e) {e.printStackTrace();}

2.抓取一个网页数据还不够,还需要该网站分页的数据,那就需要知道该网站有多少页数,这里是选择器

  • [attr=value]:带有属性值的元素,例如[width=500]   用法


<span style="white-space:pre"></span>String html = null;int total = 0;Document doc = Jsoup.connect("http://www.ifanr.com/").get();Elements links = doc.select("div.content-nav");for (Element e : links) {for(Element ent :e.select("[title=跳转到最后一页]")){html = ent.attr("href");break;}}if(html!=null&&html.length()>0){int index = html.indexOf("http://www.ifanr.com/page/");if(index!=-1&&index<html.length()){try {total = Integer.parseInt(html.substring(index,html.length()));} catch (NumberFormatException e1) {total = 822;}}}





3.相关选择器API介绍

问题

采用CSS或类似jquery 选择器(selector)语法来处理HTML文档中的数据。

方法

利用方法:Element.select(String selector)和Elements.select(String selector)。

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");  // img with src ending .png
Element masthead = doc.select("div.masthead").first();
  // div with class=masthead
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3

描述

Jsoup的元素支持类似CSS或(jquery)的选择器语法的查找匹配的元素,可实现功能强大且鲁棒性好的查询。

jsoup elements support a CSS(or jquery) like selector syntax to find matching elements, that allows very powerful and robust queries.

Select方法可作用于Document、Element或Elements,且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

The selectmethod is available in a Document, Element, or in Elements. It is contextual, so you can filter by selecting from a specific element, or by chaining select calls.

选择(操作)返回元素列表(Elements),并提供一组方法来提取或处理结果。

Select returns a list of Elements (as Elements), which provides a range of methods to extract and manipulate the results.

选择器概要(Selector overview)

  • Tagname:通过标签查找元素(例如:a)
  • ns|tag:通过标签在命名空间查找元素,例如:fb|name查找<fb:name>元素
  • #id:通过ID查找元素,例如#logo
  • .class:通过类型名称查找元素,例如.masthead
  • [attribute]:带有属性的元素,例如[href]
  • [^attr]:带有名称前缀的元素,例如[^data-]查找HTML5带有数据集(dataset)属性的元素
  • [attr=value]:带有属性值的元素,例如[width=500]
  • [attr^=value],[attr$=value],[attr*=value]:包含属性且其值以value开头、结尾或包含value的元素,例如[href*=/path/]
  • [attr~=regex]:属性值满足正则表达式的元素,例如img[src~=(?i)\.(png|jpe?g)]
  • *:所有元素,例如*

选择器组合方法

  • el#id::带有ID的元素ID,例如div#logo
  • el.class:带类型的元素,例如. div.masthead
  • el[attr]:包含属性的元素,例如a[href]
  • 任意组合:例如a[href].highlight
  • ancestor child:继承自某祖(父)元素的子元素,例如.body p查找“body”块下的p元素
  • parent > child:直接为父元素后代的子元素,例如: div.content > pf查找p元素,body > * 查找body元素的直系子元素
  • siblingA + siblingB:查找由同级元素A前导的同级元素,例如div.head + div
  • siblingA ~ siblingX:查找同级元素A前导的同级元素X例如h1 ~ p
  • el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如div.masthead, div.logo

伪选择器(Pseudo selectors)

  • :lt(n):查找索引值(即DOM树中相对于其父元素的位置)小于n的同级元素,例如td:lt(3)
  • :gt(n):查找查找索引值大于n的同级元素,例如div p:gt(2)
  • :eq(n) :查找索引值等于n的同级元素,例如form input:eq(1)
  • :has(seletor):查找匹配选择器包含元素的元素,例如div:has(p)
  • :not(selector):查找不匹配选择器的元素,例如div:not(.logo)
  • :contains(text):查找包含给定文本的元素,大小写铭感,例如p:contains(jsoup)
  • :containsOwn(text):查找直接包含给定文本的元素
  • :matches(regex):查找其文本匹配指定的正则表达式的元素,例如div:matches((?i)login)
  • :matchesOwn(regex):查找其自身文本匹配指定的正则表达式的元素
  • 注意:上述伪选择器是0-基数的,亦即第一个元素索引值为0,第二个元素index为1等

详见SelectorAPI 参考资料所列全部信息和细节。

【原文】http://jsoup.org/cookbook/extracting-data/selector-syntax



示例完整代码

import java.io.IOException;import java.util.List;import org.jsoup.Jsoup;import org.jsoup.nodes.DataNode;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class Main {/** * @param args */public static void main(String[] args) {getNews("http://www.ifanr.com/");//p(getNewsDate("http://www.ifanr.com/462705"));}static int currentPage = 0;static String pageUrl = "http://www.ifanr.com/page/";static int totalPage = -1;public static void getNews(String url){currentPage++;try {Document doc = Jsoup.connect(url).get();if(totalPage==-1){totalPage = getTotalPageNo(doc);}Elements links = doc.select("div.entry-header");int index = 0;for (Element e : links) {Elements elements = e.select("span.number").select("a[href]");for (Element element : elements) {p(element.attr("href"));p(element.attr("title").replace("Comment on ", ""));p(getNewsDate(element.attr("href")));}index++;}while(currentPage<totalPage){getNews(pageUrl+currentPage);}} catch (Exception e) {e.printStackTrace();}}/** * 获取www.ifanr.com的新闻总页数http://www.ifanr.com/page/2 * @param doc * @return */public static int getTotalPageNo(Document doc){String html = null;int total = 822;Elements links = doc.select("div.content-nav");for (Element e : links) {for(Element ent :e.select("[title=跳转到最后一页]")){html = ent.attr("href");break;}}if(html!=null&&html.length()>0){int index = html.indexOf("http://www.ifanr.com/page/");if(index!=-1&&index<html.length()){try {total = Integer.parseInt(html.substring(index,html.length()));} catch (NumberFormatException e1) {total = 822;}}}return total;}/** * 获取新闻发布时间 * 20141023184715 * @param url * @return */public static long getNewsDate(String url){String dateStr = null;long date = 0;try {Document doc = Jsoup.connect(url).get();Elements links =  doc.select("meta").select("[name=weibo: article:create_at]");for (Element e : links) {dateStr = e.attr("content").replace("-", "").replace(" ", "").replace(":", "");}} catch (IOException e) {e.printStackTrace();}if(dateStr!=null){date = Long.parseLong(dateStr);}return date;}public static void p(Object o) {System.out.println(o);}}


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买家点的好评写的差评怎么办 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办 幸果手机开机数字便按不动了怎么办 苹果6s黑屏但没关机怎么办 苹果6p突然黑屏怎么办单冷接电话 华硕86u的5g掉线找不到怎么办 信而富额度被清0怎么办 贷款回访电话回答错两个问题怎么办 天天中彩票获取期号失败怎么办 借贷宝电话打到家里了怎么办 私人借款付了利息不下款怎么办 别人借钱不还打电话不接怎么办 有信电话给别人打电话不接怎么办 别人欠我材料钱不接电话怎么办 别人欠我两千块钱不接电话怎么办 欠下很多钱没法面对父母怎么办 客户货款已打但要求改包装怎么办 微信好友欠钱不还还把我拉黑怎么办 微信朋友欠钱把我拉黑了怎么办 淘宝东西寄回去订单号忘写了怎么办 商家退款后客户不退回商品怎么办 有凭证还了本金不消条怎么办 华为荣耀畅玩7x充电慢怎么办 发现淘宝店盗用了我拍的视频怎么办 淘宝售假只能发布50个宝贝怎么办 在肯德基买的券过期了怎么办 新买的手机实体店不给换怎么办