Jsoup的使用

 

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。请参考http://jsoup.org/

     jsoup的主要功能如下:

从一个URL,文件或字符串中解析HTML;

使用DOM或CSS选择器来查找、取出数据;

可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

  下载和安装:

maven安装方法:

把下面放入pom.xml下

<dependency>

<!-- jsoup HTML parser library @ http://jsoup.org/ -->

<groupId>org.jsoup</groupId>

<artifactId>jsoup</artifactId>

<version>1.5.2</version>

</dependency>

用jsoup解析html的方法如下:

解析url html方法

Document doc =Jsoup.connect("http://example.com")  .data("query","Java")
  .userAgent("Mozilla")
  .cookie("auth","token")
  .timeout(3000)
  .post();

从文件中解析的方法:

File input =newFile("/tmp/input.html");Document doc =Jsoup.parse(input,"UTF-8","http://example.com/");

类试js  jsoup提供下面方法:

同时还提供下面的方法提供获取兄弟节点:

siblingElements()firstElementSibling()lastElementSibling();nextElementSibling()previousElementSibling()

用下面方法获得元素的数据:

操作html提供了下面方法:

通过类似jquery的方法操作html
File input =newFile("/tmp/input.html");Document doc =Jsoup.parse(input,"UTF-8","http://example.com/");Elements links = doc.select("a[href]");// a with hrefElements pngs = doc.select("img[src$=.png]");
  // img with src ending .pngElement masthead = doc.select("div.masthead").first();
  // div with class="masthead"Elements resultLinks = doc.select("h3.r > a");// direct a after h3

支持的操作有下面这些:

  • tagname 操作tag
  • ns|tag ns或tag
  • #id  用id获得元素 
  • .class 用class获得元素
  • [attribute] 属性获得元素
  • [^attr]: 以attr开头的属性
  • [attr=value] 属性值为value
  • [attr^=value][attr$=value][attr*=value] 
  • [attr~=regex]正则
  • *:所以的标签

选择组合

  • el#id el和id定位
  • el.class e1和class定位
  • el[attr] e1和属性定位
  • ancestor child ancestor下面的child
等等
抓取网站标题和内容及里面图片的事例:
  1. public  void parse(String urlStr) {
  2. // 返回结果初始化。
  3. Document doc = null;
  4. try {
  5. doc = Jsoup
  6. .connect(urlStr)
  7. .userAgent(
  8. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)") // 设置User-Agent
  9. .timeout(5000) // 设置连接超时时间
  10. .get();
  11. } catch (MalformedURLException e) {
  12. log.error( e);
  13. return ;
  14. } catch (IOException e) {
  15. if (e instanceof SocketTimeoutException) {
  16. log.error( e);
  17. return ;
  18. }
  19. if(e instanceof UnknownHostException){
  20. log.error(e);
  21. return ;
  22. }
  23. log.error( e);
  24. return ;
  25. }
  26. system.out.println(doc.title());
  27. Element head = doc.head();
  28. Elements metas = head.select("meta");
  29. for (Element meta : metas) {
  30. String content = meta.attr("content");
  31. if ("content-type".equalsIgnoreCase(meta.attr("http-equiv"))
  32. && !StringUtils.startsWith(content, "text/html")) {
  33. log.debug( urlStr);
  34. return ;
  35. }
  36. if ("description".equalsIgnoreCase(meta.attr("name"))) {
  37. system.out.println(meta.attr("content"));
  38. }
  39. }
  40. Element body = doc.body();
  41. for (Element img : body.getElementsByTag("img")) {
  42. String imageUrl = img.attr("abs:src");//获得绝对路径
  43. for (String suffix : IMAGE_TYPE_ARRAY) {
  44. if(imageUrl.indexOf("?")>0){
  45. imageUrl=imageUrl.substring(0,imageUrl.indexOf("?"));
  46. }
  47. if (StringUtils.endsWithIgnoreCase(imageUrl, suffix)) {
  48. imgSrcs.add(imageUrl);
  49. break;
  50. }
  51. }
  52. }
  53. }

里重点要提的是怎么获得图片或链接的决定地址:

如上获得绝对地址的方法String imageUrl = img.attr("abs:src");//获得绝对路径 ,前面添加abs:jsoup就会获得决定地址;

想知道原因,咱们查看下源码,如下:

  1. //该方面是先从map中找看是否有该属性key,如果有直接返回,如果没有检查是否
  2. //以abs:开头
  3. public String attr(String attributeKey) {
  4. Validate.notNull(attributeKey);
  5. if (hasAttr(attributeKey))
  6. return attributes.get(attributeKey);
  7. else if (attributeKey.toLowerCase().startsWith("abs:"))
  8. return absUrl(attributeKey.substring("abs:".length()));
  9. else return "";
  10. }

接着查看absUrl方法:

  1. /**
  2. * Get an absolute URL from a URL attribute that may be relative (i.e. an <code>&lt;a href></code> or
  3. * <code>&lt;img src></code>).
  4. * <p/>
  5. * E.g.: <code>String absUrl = linkEl.absUrl("href");</code>
  6. * <p/>
  7. * If the attribute value is already absolute (i.e. it starts with a protocol, like
  8. * <code>http://</code> or <code>https://</code> etc), and it successfully parses as a URL, the attribute is
  9. * returned directly. Otherwise, it is treated as a URL relative to the element's {@link #baseUri}, and made
  10. * absolute using that.
  11. * <p/>
  12. * As an alternate, you can use the {@link #attr} method with the <code>abs:</code> prefix, e.g.:
  13. * <code>String absUrl = linkEl.attr("abs:href");</code>
  14. *
  15. * @param attributeKey The attribute key
  16. * @return An absolute URL if one could be made, or an empty string (not null) if the attribute was missing or
  17. * could not be made successfully into a URL.
  18. * @see #attr
  19. * @see java.net.URL#URL(java.net.URL, String)
  20. */
  21. //看到这里大家应该明白绝对地址是怎么取的了
  22. public String absUrl(String attributeKey) {
  23. Validate.notEmpty(attributeKey);
  24. String relUrl = attr(attributeKey);
  25. if (!hasAttr(attributeKey)) {
  26. return ""; // nothing to make absolute with
  27. } else {
  28. URL base;
  29. try {
  30. try {
  31. base = new URL(baseUri);
  32. } catch (MalformedURLException e) {
  33. // the base is unsuitable, but the attribute may be abs on its own, so try that
  34. URL abs = new URL(relUrl);
  35. return abs.toExternalForm();
  36. }
  37. // workaround: java resolves '//path/file + ?foo' to '//path/?foo', not '//path/file?foo' as desired
  38. if (relUrl.startsWith("?"))
  39. relUrl = base.getPath() + relUrl;
  40. URL abs = new URL(base, relUrl);
  41. return abs.toExternalForm();
  42. } catch (MalformedURLException e) {
  43. return "";
  44. }
  45. }
  46. }

【转】jsoup的使用的更多相关文章

  1. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

  2. Jsoup系列学习(2)-解析html文件

    解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...

  3. Jsoup系列学习(1)-发送get或post请求

    简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 官 ...

  4. 使用 jsoup 对 HTML 文档进行解析和操作

    jsoup 简介 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HT ...

  5. jsoup获取图片示例

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...

  6. jsoup获取文档类示例

    import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsou ...

  7. Jsoup解析html终于成功了!!!

    package com.eric.pickupjoke.activity; import java.io.IOException; import java.io.InputStream; import ...

  8. Jsoup做接口测试

    最早用Jsoup是有一个小的爬虫应用要写,发现Jsoup较HttpClient轻便多了,API也方便易懂,上手很快,对于response的Document解析的选择器用的是cssSelector(Jq ...

  9. jsoup开发网页客户端3

    这个系列好久没更新,最近好忙,老大说未来是Html5的,所以最近一直学习前端以及Html5的一些东西.Android5.0的诞生,让我们眼前一亮,独特的Material风格更是吸引了无数人. 话说不学 ...

  10. Jsoup开发网站客户端第二篇,图片轮播,ScrollView兼容ListView

    最近一段日子忙的焦头烂额,代码重构,新项目编码,导致jsoup开发网站客户端也没时间继续下去,只能利用晚上时间去研究了.今天实现美食网首页图片轮播效果,网站效果图跟Android客户端实现如图: 从浏 ...

随机推荐

  1. 使用metasploit进行栈溢出攻击-5

    我们先尝试使用这个脚本进行攻击: msf > use exploit/linux/myvictim msf exploit(myvictim) > set payload linux/x8 ...

  2. JVM各区域的用途

    程序计数器 用于给字节码解释器来选取吓一跳需要执行的字节码指令.每个线程有一个独立的程序计数器去,且各个线程之间互不影响.如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令 ...

  3. java java web及tomcat的使用

     java web及tomcat的使用 一.什么是java web: 参考百度百科: http://baike.baidu.com/link?url=HnaWXFD7wFfPAlFMW02GV6r5p ...

  4. Django会话,用户和注册之用户认证

    通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供 ...

  5. Android为 ContentProvider 提供了那些服务内容?

    ContentProvider 可以调用系统想要共享的内容,安卓为我们提供了哪些和大家共享的东西呢? 官方文档: https://developer.android.com/reference/and ...

  6. SQL Server 附加数据库 错误5210

    前言 那天在弄机房的时候,附加数据库总是附加不上,然而将附加数据库文件放到优盘里,就可以附加成功.我也不知道为什么了,但是这次还是别将就了.于是乎,上网查了查原来是权限不够啊.这可怎么办,见下面三种方 ...

  7. 数据库 first

    数据库原理 .SQL(DDL.DML) 字符串操作 .数值操作 .日期操作 .空值操作 SQL(基础查询) .SQL(关联查询) SQL(高级查询)  子查询 视图.序列.索引 .约束

  8. P3768 简单的数学题 杜教筛+推式子

    \(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...

  9. CF1101E Polycarp's New Job

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #i ...

  10. CF1101B Accordion 模拟

    前后扫一遍: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib ...