jsoup入门

jsoup是一款Java的HTML解析器,主要用来对HTML解析。官网 中文文档

jsoup是一款Java的HTML解析器,主要用来对HTML解析。官网 
 中文文档

 

在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,

在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,

时间:2016-7-7 00:05

就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。

就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。

 

虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。

 

 

所以,主要还是用来对HTML进行解析。

虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。

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

◆其中,要被解析的HTML可以是一个HTML的字符串,可以是一个URL,可以是一个文件。

所以,主要还是用来对HTML进行解析。

 

org.jsoup.Jsoup把输入的HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素。

◆其中,要被解析的HTML可以是一个HTML的字符串,可以是一个URL,可以是一个文件。

jsoup的主要功能如下:

org.jsoup.nodes.Document继承了org.jsoup.nodes.Element,Element又继承了org.jsoup.nodes.Node类。里面提供了丰富的方法来获取HTML的元素。

org.jsoup.Jsoup把输入的HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素。

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

◇从URL获取HTML来解析

org.jsoup.nodes.Document继承了org.jsoup.nodes.Element,Element又继承了org.jsoup.nodes.Node类。里面提供了丰富的方法来获取HTML的元素。

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

Document doc = Jsoup.connect("http://www.baidu.com/").get();String title = doc.title();

 

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

其中Jsoup.connect方法返回一个org.jsoup.Connection对象。在Connection对象中,我们可以执行get或者post来执行请求。但是在执行请求之前,我们可以使用Connection对象来设置一些请求信息。比如:头信息,cookie,请求等待时间,代理等等来模拟浏览器的行为。

◇解析HTML字符串

 

Document doc = Jsoup.connect("http://example.com") .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout .post();
String html = "<html><head><title>First parse</title></head>"  + "<body><p>Parsed HTML into a doc.</p></body></html>";Document doc = Jsoup.parse(html);

jsoup解析

◆获得Document对象后,接下来就是解析Document对象,并从中获取我们想要的元素了。

 

Jsoup提供一系列的静态解析方法生成Document对象

Document中提供了丰富的方法来获取指定元素。

◇从URL获取HTML来解析

static Document parse(File in, String charsetName)

◇使用DOM的方式来取得

Document doc = Jsoup.connect("http://example.com/").get();String title = doc.title();

static Document parse(File in, String charsetName, String baseUri)

getElementById(String id):通过id来获取 getElementsByTag(String
tagName):通过标签名字来获取 getElementsByClass(String
className):通过类名来获取 getElementsByAttribute(String
key):通过属性名字来获取 getElementsByAttributeValue(String key, String
value):通过指定的属性名字,属性值来获取 getAllElements():获取所有元素

其中Jsoup.connect(“xxx”)方法返回一个org.jsoup.Connection对象。

static Document parse(InputStream in, String charsetName, String
baseUri)

◇通过类似于css或jQuery的选择器来查找元素

在Connection对象中,我们可以执行get或者post来执行请求。但是在执行请求之前,

static Document parse(String html)

使用的是Element类的下记方法:

我们可以使用Connection对象来设置一些请求信息。比如:头信息,cookie,请求等待时间,代理等等来模拟浏览器的行为。

static Document parse(String html, String baseUri)   

public Elements select(String cssQuery)

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

static Document parse(URL url, int timeoutMillis)

通过传入一个类似于CSS或jQuery的选择器字符串,来查找指定元素。

 

static Document parseBodyFragment(String bodyHtml)

例子:

◇从文件加载HTML来解析

static Document parseBodyFragment(String bodyHtml, String baseUri) 

File input = new File("/tmp/input.html");Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");Elements links = doc.select("a[href]"); //带有href属性的a元素Elements pngs = doc.select("img[src$=.png]"); //扩展名为.png的图片Element masthead = doc.select("div.masthead").first(); //class等于masthead的div标签Elements resultLinks = doc.select("h3.r > a"); //在h3元素之后的a元素
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

其中baseUri表示检索到的相对URL是相对于baseUriURL的 

选择器的更多语法(可以在org.jsoup.select.Selector中查看到更多关于选择器的语法):

 

其中charsetName表示字符集

tagname: 通过标签查找元素,比如:a ns|tag:
通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找
<fb:name> 元素 #id: 通过ID查找元素,比如:#logo .class:
通过class名称查找元素,比如:.masthead [attribute]:
利用属性查找元素,比如:[href] [^attr]:
利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5
Dataset属性的元素 [attr=value]:
利用属性值来查找元素,比如:[width=500] [attr^=value],
[attr$=value], [attr=value]:
利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href=/path/]
[attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如:
img[src~=.(png|jpe?g)] *: 这个符号将匹配所有元素

◆获得Document对象后,接下来就是解析Document对象,并从中获取我们想要的元素了。

 

Selector选择器组合使用 el#id: 元素+ID,比如: div#logo el.class:
元素+class,比如: div.masthead el[attr]: 元素+class,比如: a[href]
任意组合,比如:a[href].highlight ancestor child:
查找某个元素下子元素,比如:可以用.body p 查找在”body”元素下的所有 p元素
parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content
> p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head +
div siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p el, el,
el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead,
div.logo

Document中提供了丰富的方法来获取指定元素。

Connection connect(String url)
根据给定的url(必须是http或https)来创建连接

伪选择器selectors :lt:
查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt
表示小于三列的元素 :gt:查找哪些元素的同级索引值大于n,比如: div
p:gt表示哪些div中有包含2个以上的p元素 :eq:
查找哪些元素的同级索引值与n相等,比如:form
input:eq表示包含一个input标签的Form元素 :has:
查找匹配选择器包含元素的元素,比如:div:has表示哪些div包含了p元素 :not:
查找与选择器不匹配的元素,比如: div:not 表示不包含 元素的所有 div 列表
:contains: 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains
:containsOwn: 查找直接包含给定文本的元素 :matches:
查找哪些元素的文本匹配指定的正则表达式,比如:div:matcheslogin)
:matchesOwn: 查找自身包含文本匹配指定正则表达式的元素注意
:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等

◇使用DOM的方式来取得  

 

◆通过上面的选择器,我们可以取得一个Elements对象,它继承了ArrayList对象,里面放的全是Element对象。

  getElementById(String id):通过id来获取
  getElementsByTag(String tagName):通过标签名字来获取
  getElementsByClass(String className):通过类名来获取
  getElementsByAttribute(String key):通过属性名字来获取
  getElementsByAttributeValue(String key, String
value):通过指定的属性名字,属性值来获取
  getAllElements():获取所有元素

Connection 提供一些方法来抓去网页内容

接下来我们要做的就是从Element对象中,取出我们真正需要的内容。

◇通过类似于css或jQuery的选择器来查找元素

Connection cookie(String name, String value) 发送请求时放置cookie 

通常有下面几种方法:

   使用的是Element类的下记方法:

Connection data(Map<String,String> data) 传递请求参数 

◇Element.text()

    public Elements select(String cssQuery)

Connection data(String… keyvals) 传递请求参数

这个方法用来取得一个元素中的文本。

  通过传入一个类似于CSS或jQuery的选择器字符串,来查找指定元素。

Document get() 以get方式发送请求并对返回结果进行解析

◇Element.html()或Node.outerHtml()

例子:

Document post()以post方式发送请求并对返回结果进行解析 

这个方法用来取得一个元素中的html内容

图片 1

Connection userAgent(String userAgent) 

◇Node.attr(String key)

File input = new File("/tmp/input.html");Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");Elements links = doc.select("a[href]"); //带有href属性的a元素Elements pngs = doc.select("img[src$=.png]");  //扩展名为.png的图片Element masthead = doc.select("div.masthead").first();  //class等于masthead的div标签Elements resultLinks = doc.select("h3.r > a"); //在h3元素之后的a元素

Connection header(String name, String value) 添加请求头

获得一个属性的值,例如取得超链接<a href=””>中href的值

图片 2

Connection referrer(String referrer) 设置请求来源

综合实例:采集开源中国项目信息

package com.company;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.IOException;import java.util.HashSet;import java.util.Set;public class Main { public static void main(String[] args) throws IOException { // write your code here Set<String> setUrls = new HashSet<>(); for(int i = 1; i <= 5; i++) { String strUrl = "https://www.oschina.net/project/list?company=0&sort=score&lang=0&recommend=false&p="+i; setUrls.add; } Set<String> setProjUrls = new HashSet<>(); for(String stringUrl : setUrls) { Document document = Jsoup.connect(stringUrl) .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0") .get(); // System.out.println; Elements elements = document.select("div.box.item"); for(Element element : elements) { Elements eleUrl = element.select("div.box-aw a"); String strPrjUrl = eleUrl.attr; setProjUrls.add(strPrjUrl); // System.out.println(strPrjUrl); Elements eleTitle = eleUrl.select; String strTitle = eleTitle.text(); // System.out.println; Elements eleSummary = eleUrl.select(".summary"); String strSummary = eleSummary.text(); // System.out.println(strSummary); } } for(String stringUrl : setProjUrls) { Document document = Jsoup.connect(stringUrl) .userAgent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0") .get(); Elements elements = document.select("div.box-aw a h1"); String strTitle = elements.text(); System.out.println("标题:" + strTitle); Elements elementsSection = document.select("section.list"); int nSize = elementsSection.get.children; if(nSize == 0) continue; Element elementProtocol = elementsSection.get.child; Elements elesPro = elementProtocol.select; String strPro = elesPro.text(); System.out.println("开源协议:" + strPro); nSize--; if(nSize == 0) continue; Element elementLan = elementsSection.get.child; Elements elesLan = elementLan.select.get.children(); StringBuilder strlan = new StringBuilder(); for(Element ele : elesLan) { String strLanTemp = ele.text(); if(strLanTemp.indexOf>=0) break; strlan.append(strLanTemp+","); } if(elesLan.size { String strLanguage = strlan.toString().substring(0,strlan.length; System.out.println("开发语言:" + strLanguage); } nSize--; if(nSize == 0) continue; Element elementOS = elementsSection.get.child; Elements elesOS = elementOS.select; String strOS = elesOS.text(); System.out.println("操作系统:" + strOS); nSize--; if(nSize == 0) continue; Element elementAuthor = elementsSection.get.child; Elements elesAuthor = elementAuthor.select; String strAuthor= elesAuthor.text(); System.out.println("软件作者;" + strAuthor); System.out.println("---------------------"); } }}

 

 

爬取腾讯首页全部图片

package com.company;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.*;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.net.URLEncoder;public class meizi { /** * 下载图片到指定目录 * * @param filePath 文件路径 * @param imgUrl 图片URL */ public static void downImages(String filePath, String imgUrl) { // 若指定文件夹没有,则先创建 File dir = new File; if (!dir.exists { dir.mkdirs(); } // 截取图片文件名 String fileName = imgUrl.substring(imgUrl.lastIndexOf + 1, imgUrl.length; try { // 文件名里面可能有中文或者空格,所以这里要进行处理。但空格又会被URLEncoder转义为加号 String urlTail = URLEncoder.encode(fileName, "UTF-8"); // 因此要将加号转化为UTF-8格式的%20 imgUrl = imgUrl.substring(0, imgUrl.lastIndexOf + urlTail.replaceAll("\+", "\%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 写出的路径 File file = new File(filePath + File.separator + fileName); try { // 获取图片URL URL url = new URL; // 获得连接 URLConnection connection = url.openConnection(); // 设置10秒的相应时间 connection.setConnectTimeout(10 * 1000); // 获得输入流 InputStream in = connection.getInputStream(); // 获得输出流 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream; // 构建缓冲区 byte[] buf = new byte[1024]; int size; // 写入到文件 while (-1 != (size = in.read { out.write(buf, 0, size); } out.close(); in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { // 利用Jsoup获得连接 Connection connect = Jsoup.connect("http://www.qq.com"); try { // 得到Document对象 Document document = connect.get(); // 查找所有img标签 Elements imgs = document.getElementsByTag; System.out.println("共检测到下列图片URL:"); System.out.println; // 遍历img标签并获得src的属性 for (Element element : imgs) { //获取每个img标签URL "abs:"表示绝对路径 String imgSrc = element.attr("abs:src"); // 打印URL System.out.println; //下载图片到本地 meizi.downImages("d:/img", imgSrc); } System.out.println; } catch (IOException e) { e.printStackTrace(); } }}

选择器的更多语法(可以在org.jsoup.select.Selector中查看到更多关于选择器的语法):

jsoup提供类似JS获取html元素:

解析json

package com.company;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import org.jsoup.Connection;import org.jsoup.Jsoup;import java.io.IOException;/** * Created by Administrator on 2018/8/8. */public class hello { public static void main(String[] args) throws IOException { Connection.Response res = Jsoup.connect("https://www.wukong.com/wenda/web/nativefeed/brow/?concern_id=6300775428692904450&t=1533714730319&_signature=DKZ7mhAQV9JbkTPBachKdgyme4") .header("Accept", "*/*") .header("Accept-Encoding", "gzip, deflate") .header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3") .header("Content-Type", "application/json;charset=UTF-8") .header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0") .timeout.ignoreContentType.execute();//.get(); String body = res.body(); System.out.println; JSONObject jsonObject2 = JSON.parseObject; JSONArray jsonArray = jsonObject2.getJSONArray; //JSONArray jsonArray1 = JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的 //遍历方式1 int size = jsonArray.size(); for (int i = 0; i < size; i++){ JSONObject jsonObject = jsonArray.getJSONObject; if(jsonObject.containsKey("question")) { JSONObject jsonObject3 = jsonObject.getJSONObject("question"); String qid = jsonObject3.getString; System.out.println; } } }}

  tagname: 通过标签查找元素,比如:a
  ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找
<fb:name> 元素
  #id: 通过ID查找元素,比如:#logo
  .class: 通过class名称查找元素,比如:.masthead
  [attribute]: 利用属性查找元素,比如:[href]
  [^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-]
来查找带有HTML5 Dataset属性的元素
  [attr=value]: 利用属性值来查找元素,比如:[width=500]
  [attr^=value], [attr$=value], [attr*=value]:
利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
  [attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如:
img[src~=(?i).(png|jpe?g)]
  *: 这个符号将匹配所有元素

getElementById(String id) 用id获得元素

fastjson补充

json字符串-数组类型与JSONArray之间的转换

/** * json字符串-数组类型与JSONArray之间的转换 */ public static void testJSONStrToJSONArray(){ JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR); //JSONArray jsonArray1 = JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的 //遍历方式1 int size = jsonArray.size(); for (int i = 0; i < size; i++){ JSONObject jsonObject = jsonArray.getJSONObject; System.out.println(jsonObject.getString("studentName")+":"+jsonObject.getInteger("studentAge")); } //遍历方式2 for (Object obj : jsonArray) { JSONObject jsonObject = (JSONObject) obj; System.out.println(jsonObject.getString("studentName")+":"+jsonObject.getInteger("studentAge")); } }

复杂json格式字符串与JSONObject之间的转换

/** * 复杂json格式字符串与JSONObject之间的转换 */ public static void testComplexJSONStrToJSONObject(){ JSONObject jsonObject = JSON.parseObject(COMPLEX_JSON_STR); //JSONObject jsonObject1 = JSONObject.parseObject(COMPLEX_JSON_STR);//因为JSONObject继承了JSON,所以这样也是可以的 String teacherName = jsonObject.getString("teacherName"); Integer teacherAge = jsonObject.getInteger("teacherAge"); JSONObject course = jsonObject.getJSONObject; JSONArray students = jsonObject.getJSONArray("students"); }

Selector选择器组合使用
  el#id: 元素+ID,比如: div#logo
  el.class: 元素+class,比如: div.masthead
  el[attr]: 元素+class,比如: a[href]
  任意组合,比如:a[href].highlight
  ancestor child: 查找某个元素下子元素,比如:可以用.body p
查找在”body”元素下的所有 p元素
  parent > child:
查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p
元素,也可以用body > * 查找body标签下所有直接子元素
  siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head

getElementsByTag(String tag) 用标签获得元素

另一个实例(采集悟空问答某个问题的评论信息)

package com.company;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.*;public class meizi { public static void main(String[] args) { // 利用Jsoup获得连接 Connection connect = Jsoup.connect("https://www.wukong.com/question/6586953004245582083/"); try { // 得到Document对象 Document document = connect.get(); Elements elements = document.select(".question-name"); System.out.println(elements.get); Elements elements2 = document.select(".answer-item"); for(Element element : elements2) { Elements elements3 = element.select(".answer-user-avatar img"); System.out.println(elements3.attr("abs:src")); elements3 = element.select(".answer-user-name"); System.out.println(elements3.text; elements3 = element.select(".answer-user-tag"); System.out.println(elements3.text; elements3 = element.select(".answer-text"); System.out.println(elements3.text; } } catch (IOException e) { e.printStackTrace(); } }}
  • div
      siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
      el, el,
    el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead,
    div.logo

getElementsByClass(String className) 用class获得元素

伪选择器selectors
  :lt(n):
查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3)
表示小于三列的元素
  :gt(n):查找哪些元素的同级索引值大于n,比如: div
p:gt(2)表示哪些div中有包含2个以上的p元素
  :eq(n): 查找哪些元素的同级索引值与n相等,比如:form
input:eq(1)表示包含一个input标签的Form元素
  :has(seletor):
查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
  :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo)
表示不包含 class=”logo” 元素的所有 div 列表
  :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如:
p:contains(jsoup)
  :containsOwn(text): 查找直接包含给定文本的元素
  :matches(regex):
查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
  :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
注意  :上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等

getElementsByAttribute(String key)  用属性获得元素

◆通过上面的选择器,我们可以取得一个Elements对象,它继承了ArrayList对象,里面放的全是Element对象。

同时还提供下面的方法提供获取兄弟节点:siblingElements(),
firstElementSibling(), lastElementSibling();nextElementSibling(),
previousElementSibling()

接下来我们要做的就是从Element对象中,取出我们真正需要的内容。

 

通常有下面几种方法:

获得与设置元素的数据

◇Element.text()

attr(String key)  获得元素的数据 attr(String key, String value)
设置元素数据 

  这个方法用来取得一个元素中的文本。

attributes() 获得所以属性

◇Element.html()或Node.outerHtml()

id(), className()  classNames() 获得id class得值

  这个方法用来取得一个元素中的html内容

text()获得文本值

◇Node.attr(String key)

text(String value) 设置文本值

  获得一个属性的值,例如取得超链接<a href=””>中href的值

html() 获取html 

 

html(String value)设置html

 

outerHtml() 获得内部html

◆HTML清理

data()获得数据内容

  利用org.jsoup.safety.Cleaner类的clean方法,可以HTML,避免XSS攻击。

tag()  获得tag 和 tagName() 获得tagname 

例子:

 

String unsafe =   "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";String safe = Jsoup.clean(unsafe, Whitelist.basic());// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

操作html元素:

 

append(String html), prepend(String html)

◆综合实例:

appendText(String text), prependText(String text)

这个例子将结合HttpClient来爬取页面的HTML,再利用Jsoup对页面进行分析,提取极客头条的内容。

appendElement(String tagName), prependElement(String tagName)

图片 3

html(String value)

package com.csdn;import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class HttpClientJsoupTest01 {    //url传入 "http://www.csdn.net/"     public void get(String url) {                CloseableHttpClient client=HttpClients.createDefault();    //定义一个默认的请求客户端                HttpGet get=new HttpGet(url);                //定义一个get请求        CloseableHttpResponse response=null;        //定义一个响应                try {            response=client.execute(get);            System.out.println(response.getStatusLine().getStatusCode());//打印响应状态码,200表示成功            HttpEntity entity=response.getEntity();        //获取响应实体            String html=EntityUtils.toString(entity);    //将实体的内容转换为字符串                        /**             * 接下来就利用jsoup来解析前面取得的html,并获取csdn首页的极客头条栏目下的标题             */            Document document=Jsoup.parse(html);    //利用Jsoup类的静态方法,将html转换成一个Document对象            Element element=document.select("div.wrap .left .hot_blog ul").first();    //利用select选择器,取得需要的li元素集合            Elements elements= element.select("a");    //取得a链接的集合                        for (Element element2 : elements) {                System.out.println("标题:"+element2.attr("title")+"        -->>    地址:"+element2.attr("href"));            }                    } catch (ClientProtocolException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally {            try {                response.close();                client.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

 

图片 4

jsoup还提供了类似于JQuery方式的选择器

GitHub下载

采用选择器来检索数据

 

tagname 使用标签名来定位,例如 a 

ns|tag     使用命名空间的标签定位,例如 fb:name 来查找 <fb:name>
元素 

#id     使用元素 id 定位,例如 #logo 

.class     使用元素的 class 属性定位,例如 .head 

*     定位所有元素 

[attribute] 使用元素的属性进行定位,例如 [href] 表示检索具有 href
属性的所有元素 

[^attr] 使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5
的 dataset 属性 

[attr=value]使用属性值进行定位,例如 [width=500] 定位所有 width
属性值为 500 的元素 

[attr^=value],[attr$=value],[attr*=value]
这三个语法分别代表,属性以 value 开头、结尾以及包含 

[attr~=regex]使用正则表达式进行属性值的过滤,例如
img[src~=(?i).(png|jpe?g)] 

以上是最基本的选择器语法,这些语法也可以组合起来使用

 

组合用法

el#id      定位id值某个元素,例如 a#logo -> <a id=logo href= …

el.class 定位 class 为指定值的元素,例如 div.head -> <div
class=”head”>xxxx</div> 

el[attr] 定位所有定义了某属性的元素,例如 a[href] 

以上三个任意组合     例如 a[href]#logo 、a[name].outerlink 

 

除了一些基本的语法以及这些语法进行组合外,jsoup
还支持使用表达式进行元素过滤选择

:lt(n)     例如 td:lt(3) 表示小于三列 

:gt(n)     div p:gt(2) 表示 div 中包含 2 个以上的 p 

:eq(n)     form input:eq(1) 表示只包含一个 input 的表单 

:has(seletor)     div:has(p) 表示包含了 p 元素的 div 

:not(selector)     div:not(.logo) 表示不包含 class=”logo” 元素的所有 div
列表 

:contains(text)     包含某文本的元素,不区分大小写,例如
p:contains(oschina) 

:containsOwn(text)     文本信息完全等于指定条件的过滤 

:matches(regex)     使用正则表达式进行文本过滤:div:matches((?i)login) 

:matchesOwn(regex)     使用正则表达式找到自身的文本 

 

——————————————————————————————————————————————————————————

//url网址作为输入源

Document doc =
Jsoup.connect(“http://www.example.com”).timeout(60000).get();

//File文件作为输入源

File input = new File(“/tmp/input.html”);

Document doc = Jsoup.parse(input, “UTF-8”, “”);

//String作为输入源

Document doc = Jsoup.parse(htmlStr);

和java script类似,Jsoup提供了下列的函数

getElementById(String id) 通过id获得元素

getElementsByTag(String tag) 通过标签获得元素

getElementsByClass(String className) 通过class获得元素

getElementsByAttribute(String key) 通过属性获得元素

 

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

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

 

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

attr(String key) 获得元素的数据

attr(String key, String value) 设置元素数据

attributes() 获得所有属性

id(), className() classNames() 得到id class的值

text()得到文本值

text(String value) 设置文本值

html() 获取html 

html(String value)设置html

outerHtml() 获得内部html

data()获得数据内容

tag() 得到tag 和 tagName() 得到tagname

 

操作html提供了下面方法:

append(String html), prepend(String html)

appendText(String text), prependText(String text)

appendElement(String tagName), prependElement(String tagName)

html(String value)

========================================================================================== 

爬取爱帮网首页所有城市,并打印到控制台

 

import java.io.IOException;

 

import org.jsoup.*;

import org.jsoup.nodes.*;

import org.jsoup.select.*;

 

public class GetCity {

    public static void main(String[] args) throws Exception

    {

        try {

            //加载网页地址并链接网页地址

            Document doc =
Jsoup.connect(“”).get();

//         System.out.println(doc);

            //获取ul标签里的所有元素

//         Elements tags = doc.getElementsByTag(“ul”);

            //筛选并获取第二组元素所有ul标签,索引值默认从0开始

//         Element element = tags.get(1);

//         Elements el = doc.select(“ul”).get(1).select(“li p”);

            Elements el = doc.select(“ul li p”);

            for(Element e : el)

            {

                System.out.println(e.text());

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

============================================================================================

package day01;

 

import java.io.*;

 

import org.jsoup.*;

import org.jsoup.nodes.*;

import org.jsoup.select.Elements;

 

/**

 * 2016年7月6日21:45:16 使用Jsoup解析HTML文件

 * 

 * @author WYC

 *

 */

public class JsoupDemo01 {

    public static void main(String[] args) {

        // 创建StringBuilder,存储从HTML中读取到的字符串

        StringBuilder sb = new StringBuilder();

 

        // 将文件读入内存,并打印

        BufferedReader br = null;

        try {

            // 创建HTML文件对象并与之关联

            File f = new File(“G:\Java\eclipse
workspace\Jsoup\Sample.html”);

            // 创建输入流

            FileReader fr = new FileReader(f);

            // 创建输入流缓冲区

            br = new BufferedReader(fr);

            String line = “”;

            // 判断读取到的字符串是否为null,如果不是,则继续读取

            while ((line = br.readLine()) != null) {

                // System.out.println(line);

                // 将读取到的一行数据追加到StringBuilder中并添加换行

                sb.append(line + “n”);

            }

        } catch (Exception ex) {

            ex.printStackTrace();

        } finally {

            try {

                br.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

        // 打印获取到的HTML对象信息

        // System.out.prinltn(sb.toString());

 

        // 获取HTML文档的Document对象,将HTML转换为Document对象

        // 可以通过Document对象来操作HTML中的全部内容

        Document doc1 = Jsoup.parse(sb.toString());

 

        // 解析一个body片段

        Document doc2 = Jsoup.parseBodyFragment(sb.toString());

        // 该方法仅仅是获取body部分的代码

        // Document.body()方法能够获取文档body标签的对象,

        // 与doc.getElementById(“body”);相同

        Element body = doc2.body();

        // 打印获取到的body对象

        System.out.println(body);

 

        // 根据URL来获取一个HTMLDocument对象

        // Document doc3 = null;

        // try

        // {

        // //不能使用本地路径当做URL参数

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图