java爬虫之Jsoup,方法和使用知识汇总

jsoup就是一个html解析器,从中获取到你想要的数据
我用是maven项目下面是依赖

       <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.2</version>
        </dependency>

下面是代码,我爬取的是一个html网站的素材基本信息,我写的只能爬取静态网页数据,对动态数据就没有办法了,其实很简单,请求到数据的页面html源代码后,开始各种解析代码,jsoup有大量方法,使用其中的方法就跟html选择器一样,jsoup的方法我都会贴在下面,或许我写的代码对你一点帮助没有但jsoup方法对你一定有很大的帮助

private static List<entity> data = new ArrayList<entity>();
	private static List<String> list = new ArrayList<String>();  
   public static void main(String[] args) throws IOException {
	 
	  for(int i=1;i<=4;i++) {
		                
		   String ur = "http://www.17sucai.com/pins/tag/539.html?p="+i+"";
		   Document doc = Jsoup.connect(ur).timeout(500000).header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
					.header("Accept-Encoding", "gzip, deflate, sdch").header("Accept-Language", "zh-CN,zh;q=0.8")
					.header("Accept-Language", "zh-CN,zh;q=0.8")
					.header("User-Agent", "Mozilla/31.0 (compatible; MSIE 10.0; Windows NT; DigExt)")
					.header("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)")
					.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36").get();
	      
	         Elements like = doc.select("div[class=pic]");
	         Elements ahref = like.select("a[href]");
	         String alt = null;
	         String dataurl = null;
	         for(Element s : ahref) {
	        	 
	        	 String href = s.attr("href");
	        	 if(href.indexOf("?")==-1) {
	        		 en = new entity();
	        		 en.setHref(href);
		        	 Elements img = s.select("img");
		        	 for(Element e : img) {
		        		  alt = e.attr("alt");
		        		  dataurl = e.attr("data-url"); 
		        		System.err.println(alt+"======"+dataurl);
		        		 
		        	 }
		        	 en.setUrl_img(dataurl);
	        		 en.setName(alt);
	        		 list.add(dataurl);
	        	 }
	        	 if(href.indexOf("?")!=-1) {
	        		 en.setUrl_html(href);
	        		 data.add(en);
	        	 }
	        	
	        	 
	        	
	         }
	  }
	  
	         
	       
	   
	   
}

下面是jsoup的方法大全以及具体介绍,我也是从网上收集的


1public String nodeName() 得到节点名

2public String tagName() 得到元素的标签名 如p

3public Element tagName(String tagName) 改变元素的标签 。如:el.tagName(“p”) 把一个标签改变为一个

标签。

4public Tag tag() 得到元素的Tag

5public boolean isBlock()测试元素是否是块级元素。

6public String id() 得到元素的id属性

7public Element attr(String attributeKey, String attributeValue) 设置元素的属性值。如果该键已存在,则替换掉以前的值;否则就新增。

8public Map dataset() 得到元素的HTML5自定义数据属性。元素中每个以”data-“开头的键的属性都包含在数据集范围内。

如这个元素

… 就有如下数据集:package=jsoup, language=java. 
返回的map是对元素属性的筛选后的map集合。对一个map的改变(增、删、改)会影响其他map

9public final Element parent() 得到节点的父节点

10public Elements parents() 得到元素的父类和祖先节点直到文档的根。返回元素最接近的一个父类的堆栈。

11public Element child(int index) 通过索引得到元素的子元素。

注意:一个元素的子元素可以是元素和节点的混合。这个方法只检查过滤后的子元素的集合(保留那些children是elements的children,过滤掉children是Nodes的children),index也是基于过滤后的集合的索引。

12public Elements children() 得到子元素集

13public List textNodes() 得到元素的子文本节点集合。该集合不可修改但是文字节点可以被操纵。这是一个比较有效率的过滤文字节点的方法。

例如这段html:

One Two Three 
Four

用p元素来选择。 
p.text() = “One Two Three Four” p.ownText() = “One Three Four” p.children() = Elements[, 
] p.childNodes() = List[“One “, , ” Three “, 
, ” Four”] p.textNodes() = List[“One “, ” Three “, ” Four”] 
14public List dataNodes() 得到元素的子数据节点。该集合不可修改但是数据节点可以被操纵。这是一个比较有效率的过滤数据节点的方法。

15public Elements select(String cssQuery) 查询匹配CSS query选择器的元素集。被匹配的元素可能是它本身,也可能是它的任意子元素。 这种方法通常比使用DOM类型getelementby *的方法更强大,因为多个过滤器可以结合。如:

el.select(“a[href]) - finds links (a tags with href attributes) el.select(“a[href*=example.com]) - finds links pointing to example.com (loosely) 
16public Element appendChild(Node child) 给元素增加一个子节点。要求该子节点没有已经存在父类。

17public Element prependChild(Node child) 在该元素的子元素们的最前面增加一个子节点。要求该子节点没有已经存在父类。

18public Element appendElement(String tagName) 使用tagName创建一个新的元素,然后把它作为该元素的最后一个子元素。如:parent.appendElement(“h1”).attr(“id”, “header”).text(“Welcome”);

19public Element prependElement(String tagName) 创建一个新的元素,然后把它作为该元素的第一个子元素。

20public Element appendText(String text) 创建一个新的文字节点,然后追加到该元素中。

21public Element prependText(String text) 创建一个新的文字节点,置于该元素子元素的最前面。

22public Element append(String html) 增加一段html到该元素中,该html会被解析,然后每个节点都会置于元素末尾。

23public Element prepend(String html) 增加一段html到该元素中,该html会被解析,然后每个节点都会置于元素开头。

24public Element before(String html) 在该元素前面插入一段指定的html到DOM树中。比如用来作为前面的兄弟节点。

25public Element before(Node node) 在该节点前面插入一个指定的节点到DOM树中。比如用来作为前面的兄弟节点。

26public Element after(String html) 在该元素后面插入一段指定的html到DOM树中。比如用来作为后面的兄弟节点。

27public Element after(Node node) 在该节点后面插入一个指定的节点到DOM树中。比如用来作为后面的兄弟节点。

28public Element empty() 移除该元素的所有子节点。

29public Element wrap(String html) 用提供的html包装该元素。

30public Elements siblingElements() 得到元素的兄弟元素。该元素本身不包含在内。

31public Element nextElementSibling() 得到该元素的下一个兄弟元素。

32public Element previousElementSibling() 得到该元素的上一个兄弟元素。

33public Element firstElementSibling() 得到该元素的第一个兄弟元素。

34public Integer elementSiblingIndex() 得到该元素在兄弟元素集合中的索引。如果该元素是第一个,则返回0.

35public Element lastElementSibling() 得到该元素的最后一个兄弟元素。

36public Elements getElementsByTag(String tagName) 根据tagName查询子元素集

37public Element getElementById(String id) 通过ID查找元素。包括元素本身和其子元素都在查询范围内。

注意:该方法寻找的是从该元素开始的第一个匹配的ID对应的元素,如果从不同位置作为起点去寻找可能得到不同的匹配该ID的元素

38public Elements getElementsByClass(String className) 寻找包含className的class的元素集。包括元素本身和其子元素都在查询范围内。不区分大小写。元素集可能包含多个class(

) 这个方法会检测每一个class,所以你可以使用el.getElementsByClass(“header”)找到上面这个元素。

39public Elements getElementsByAttribute(String key) 通过元素属性的键寻找元素集。

40public Elements getElementsByAttributeStarting(String keyPrefix) 根据属性的前缀寻找元素。HTML5属性集使用data-前缀

41public Elements getElementsByAttributeValue(String key, String value) 寻找属性为指定值的元素。不区分大小写。

42public Elements getElementsByAttributeValueNot(String key, String value) 寻找不包含指定属性的或者包含但有不同值的元素集。不区分大小写。

43public Elements getElementsByAttributeValueStarting(String key, String valuePrefix) 寻找键为key,值以valuePrefix开头的元素集。

44public Elements getElementsByAttributeValueEnding(String key, String valueSuffix) 寻找键为key,值以valueSuffix作为后缀的元素集。

45public Elements getElementsByAttributeValueContaining(String key, String match) 寻找键为key,值包含match的元素集。

46public Elements getElementsByAttributeValueMatching(String key, Pattern pattern) 寻找键为key,值匹配给定的正则表达式的元素集。

47public Elements getElementsByAttributeValueMatching(String key, String regex) 寻找键为key,值匹配给定的正则表达式的元素集。

48public Elements getElementsByIndexLessThan(int index) 寻找那些索引小于index的兄弟元素集。

49public Elements getElementsByIndexGreaterThan(int index) 寻找那些索引大于index的兄弟元素集。

50public Elements getElementsByIndexEquals(int index) 寻找那些索引等于index的兄弟元素集。

51public Elements getElementsContainingText(String searchText) 寻找包含searchText字符串的元素集。不区分大小写。该文本可能直接出现在该元素中,也可能出现在其子孙元素中。

52public Elements getElementsContainingOwnText(String searchText) 寻找包含searchText字符串的元素集。不区分大小写。该文本是出现在该元素中。而不是其子孙元素中。

53public Elements getElementsMatchingText(Pattern pattern) 寻找文本匹配给定正则表达式的元素集。

54public Elements getElementsMatchingText(String regex) 寻找文本匹配给定正则表达式的元素集。

55public Elements getElementsMatchingOwnText(Pattern pattern) 寻找自身文本匹配给定正则表达式的元素集。

56public Elements getElementsMatchingOwnText(String regex) 寻找自身文本匹配给定正则表达式的元素集。

57public Elements getAllElements() 寻找所有元素集,包含自身和其子孙。

58public String text() 得到该元素文本和和其子孙文本的结合。如:

Hello there now!

p.text()会返回”Hello there now!59public String ownText() 得到该元素自身的文本。如:

Hello there now!

p.ownText()会返回”Hello now!60public Element text(String text) 设置元素的文本内容。之前任何存在的文本都会被清除掉。

61public boolean hasText() 测试该元素是否还有非空格的文本内容。

62public String data() 得到元素的数据结合。数据可以是脚本里面的。

63public String className() 得到元素class属性的文本内容 可能包含多个class names,用空格分开。如;

返回”header gray”。

64public Set classNames() 得到元素的所有class names,如;

,返回”header”, “gray”的set集合

65public Element classNames(Set classNames) 用提供的class names设置元素的class属性。

66public boolean hasClass(String className) 测试元素是否含有一个指定的class,不区分大小写。

67public Element addClass(String className) 给元素的class属性增加一个className值。

68public Element removeClass(String className) 从元素的class属性中移除指定值。

69public Element toggleClass(String className) 反转class属性的className值,有则移除,没有则新增。

70public String val() 得到表单元素的值

71public Element val(String value) 设置表单元素的值

72public String html() 检索元素的内部html

73public Element html(String html) 设置元素内部html,首先会清除存在的。

*****************************************************************************************************
一、Jsoup概述

1.1、简介

    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,

 可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

1.2、Jsoup的主要功能

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

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

    3)可操作HTML元素、属性、文本

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

1.3、jsoup 的主要类层次结构

  

二、入门

2.1、解析和遍历一个HTML文档

  如何解析一个HTML文档:

String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
  其解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:

    1)没有关闭的标签 

            <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>
    2)隐式标签 

        它可以自动将 <td>Table data</td>包装成<table><tr><td>?
    3)创建可靠的文档结构  

 html标签包含head 和 body,在head只出现恰当的元素
    2.2、一个文档的对象模型                

        1)文档由多个Elements和TextNodes组成

        2)其继承结构如下:Document继承Element继承Node. TextNode继承 Node.

        3)一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。

三、输入

3.1、解析一个HTML字符串

  1)存在问题

    来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,

    或想修改它。怎么办? jsoup能够帮你轻松解决这些问题

  2)解决方法

          使用静态Jsoup.parse(String html) 方法或 Jsoup.parse(String html, String baseUri)

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
    3)描述

            A:

                parse(String html, String baseUri) 这方法能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,

      并指定从哪个网站获取文档。如这个方法不适用,你可以使用 parse(String html) 方法来解析成HTML字符串如上面的示例。        

            B:

                只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少) 一个head和一个body元素。

            C:

                一旦拥有了一个Document,你就可以使用Document中适当的方法或它父类 Element和Node中的方法来取得相关数据。

3.2、解析一个body片断

  1)存在问题

          假如你有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析。这个HTML片断可以是用户提交的一条评论

    或在一个CMS页面中编辑body部分。

  2)办法

       使用Jsoup.parseBodyFragment(String html)方法。

String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
  3)说明

        A:

            parseBodyFragment 方法创建一个空壳的文档,并插入解析过的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html) 方法,

   通常你也可以得到相同的结果,但是明确将用户输入作为 body片段处理,以确保用户所提供的任何糟糕的HTML都将被解析成body元素。 

        B:

            Document.body() 方法能够取得文档body元素的所有子元素,与 doc.getElementsByTag("body")相同。

3.3、从一个URL加载一个Document

  1)存在问题

    你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据。

  2)解决方法

    使用 Jsoup.connect(String url)方法:

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

        connect(String url) 方法创建一个新的 Connection,get() 取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。

        Connection 接口还提供一个方法链来解决特殊请求,具体如下:

  Document doc = Jsoup.connect("http://example.com";)
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();
        这个方法只支持Web URLs (http和https 协议); 假如你需要从一个文件加载,可以使用 parse(File in, String charsetName) 代替。

3.4、从一个文件加载文档

  1)存在问题

    在本机硬盘上有一个HTML文件,需要对它进行解析从中抽取数据或进行修改。

  2)方法

    可以使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法:

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

        A:

            parse(File in, String charsetName, String baseUri) 这个方法用来加载和解析一个HTML文件。如在加载文件的时候发生错误,将抛出IOException,应作适当处理。

        B:

            baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。

        C:

            另外还有一个方法parse(File in, String charsetName) ,它使用文件的路径做为 baseUri。 这个方法适用于如果被解析文件位于网站的本地文件系统,

    且相关链接也指向该文件系统。

四、数据抽取

4.1、使用DOM方法来遍历一个文档

  1)存在问题

    你有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。

  2)方法

    将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。



File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
 
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}


   3)说明

    Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:

    A:查看元素



    getElementById(String id)
    getElementsByTag(String tag)
    getElementsByClass(String className)
    getElementsByAttribute(String key) (and related methods)
    Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
    Graph: parent(), children(), child(int index)


    B:元素数据



    attr(String key)获取属性attr(String key, String value)设置属性
    attributes()获取所有属性
    id(), className() and classNames()
    text()获取文本内容text(String value) 设置文本内容
    html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
    outerHtml()获取元素外HTML内容
    data()获取数据内容(例如:script和style标签)
    tag() and tagName()


    C:操作HTML和文本

    append(String html), prepend(String html)
    appendText(String text), prependText(String text)
    appendElement(String tagName), prependElement(String tagName)
    html(String value)
4.2、使用选择器语法来查找元素

  1)存在问题

    你想使用类似于CSS或jQuery的语法来查找和操作元素。

  2)方法

    可以使用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]"); //带有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元素


  3)说明

    jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.

    这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

    Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

    A:Selector选择器概述   

      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)]
      *: 这个符号将匹配所有元素

    B: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

    C:伪选择器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开始的,也就是

4.3、从元素抽取属性,本文和HTML

  1)存在问题

    在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。

  2)方法  

    要取得一个属性的值,可以使用Node.attr(String key) 方法
    对于一个元素中的文本,可以使用Element.text()方法
    对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法



  String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
  Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
  Element link = doc.select("a").first();//查找第一个a元素
 
  String text = doc.body().text(); // "An example link"//取得字符串中的文本
  String linkHref = link.attr("href"); // "http://example.com/"//取得链接地址
  String linkText = link.text(); // "example""//取得链接地址中的文本
 
  String linkOuterH = link.outerHtml(); 
      // "<a href="http://example.com"><b>example</b></a>"
  String linkInnerH = link.html(); // "<b>example</b>"//取得链接内的html内容


  3)说明  

    上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:

1
2
3
Element.id()
Element.tagName()
Element.className() and Element.hasClass(String className)
    这些访问器方法都有相应的setter方法来更改数据.

4.4、处理URLs

  1)存在问题

    你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs。

  2)方法    

    在你解析文档时确保有指定base URI,然后
    使用 abs: 属性前缀来取得包含base URI的绝对路径。代码如下:

  Document doc = Jsoup.connect("http://www.open-open.com").get();
 
  Element link = doc.select("a").first();
  String relHref = link.attr("href"); // == "/"
  String absHref = link.attr("abs:href"); // "http://www.open-open.com/"
  3)说明

    在HTML元素中,URLs经常写成相对于文档位置的相对路径: <a href="/download">...</a>.

    当你使用 Node.attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定定的值。

    假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href")

    因此,在解析HTML文档时,定义base URI非常重要。

    如果你不想使用abs: 前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)4.5、实例程序:获取所有连链接

  1)说明

    这个示例程序将展示如何从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。

  2)运行下面程序需要执行一个URLs作为参数



package org.jsoup.examples;
 
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
import java.io.IOException;
 
/**
 * Example program to list links from a URL.
 */
public class ListLinks {
    public static void main(String[] args) throws IOException {
        Validate.isTrue(args.length == 1, "usage: supply url to fetch");
        String url = args[0];
        print("Fetching %s...", url);
 
        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");
        Elements media = doc.select("[src]");
        Elements imports = doc.select("link[href]");
 
        print("\nMedia: (%d)", media.size());
        for (Element src : media) {
            if (src.tagName().equals("img"))
                print(" * %s: <%s> %sx%s (%s)",
                        src.tagName(), src.attr("abs:src"), src.attr("width"), src.attr("height"),
                        trim(src.attr("alt"), 20));
            else
                print(" * %s: <%s>", src.tagName(), src.attr("abs:src"));
        }
 
        print("\nImports: (%d)", imports.size());
        for (Element link : imports) {
            print(" * %s <%s> (%s)", link.tagName(),link.attr("abs:href"), link.attr("rel"));
        }
 
        print("\nLinks: (%d)", links.size());
        for (Element link : links) {
            print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
        }
    }
 
    private static void print(String msg, Object... args) {
        System.out.println(String.format(msg, args));
    }
 
    private static String trim(String s, int width) {
        if (s.length() > width)
            return s.substring(0, width-1) + ".";
        else
            return s;
    }
}


  3)查看结果



Fetching http://news.ycombinator.com/...
 
Media: (38)
 * img: <http://ycombinator.com/images/y18.gif> 18x18 ()
 * img: <http://ycombinator.com/images/s.gif> 10x1 ()
 * img: <http://ycombinator.com/images/grayarrow.gif> x ()
 * img: <http://ycombinator.com/images/s.gif> 0x10 ()
 * script: <http://www.co2stats.com/propres.php?s=1138>
 * img: <http://ycombinator.com/images/s.gif> 15x1 ()
 * img: <http://ycombinator.com/images/hnsearch.png> x ()
 * img: <http://ycombinator.com/images/s.gif> 25x1 ()
 * img: <http://mixpanel.com/site_media/images/mixpanel_partner_logo_borderless.gif> x (Analytics by Mixpan.)
 
Imports: (2)
 * link <http://ycombinator.com/news.css> (stylesheet)
 * link <http://ycombinator.com/favicon.ico> (shortcut icon)
 
Links: (141)
 * a: <http://ycombinator.com>  ()
 * a: <http://news.ycombinator.com/news>  (Hacker News)
 * a: <http://news.ycombinator.com/newest>  (new)
 * a: <http://news.ycombinator.com/newcomments>  (comments)
 * a: <http://news.ycombinator.com/leaders>  (leaders)
 * a: <http://news.ycombinator.com/jobs>  (jobs)
 * a: <http://news.ycombinator.com/submit>  (submit)
 * a: <http://news.ycombinator.com/x?fnid=JKhQjfU7gW>  (login)
 * a: <http://news.ycombinator.com/vote?for=1094578&dir=up&whence=%6e%65%77%73>  ()
 * a: <http://www.readwriteweb.com/archives/facebook_gets_faster_debuts_homegrown_php_compiler.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29&utm_content=Twitter>  (Facebook speeds up PHP)
 * a: <http://news.ycombinator.com/user?id=mcxx>  (mcxx)
 * a: <http://news.ycombinator.com/item?id=1094578>  (9 comments)
 * a: <http://news.ycombinator.com/vote?for=1094649&dir=up&whence=%6e%65%77%73>  ()
 * a: <http://groups.google.com/group/django-developers/msg/a65fbbc8effcd914>  ("Tough. Django produces XHTML.")
 * a: <http://news.ycombinator.com/user?id=andybak>  (andybak)
 * a: <http://news.ycombinator.com/item?id=1094649>  (3 comments)
 * a: <http://news.ycombinator.com/vote?for=1093927&dir=up&whence=%6e%65%77%73>  ()
 * a: <http://news.ycombinator.com/x?fnid=p2sdPLE7Ce>  (More)
 * a: <http://news.ycombinator.com/lists>  (Lists)
 * a: <http://news.ycombinator.com/rss>  (RSS)
 * a: <http://ycombinator.com/bookmarklet.html>  (Bookmarklet)
 * a: <http://ycombinator.com/newsguidelines.html>  (Guidelines)
 * a: <http://ycombinator.com/newsfaq.html>  (FAQ)
 * a: <http://ycombinator.com/newsnews.html>  (News News)
 * a: <http://news.ycombinator.com/item?id=363>  (Feature Requests)
 * a: <http://ycombinator.com>  (Y Combinator)
 * a: <http://ycombinator.com/w2010.html>  (Apply)
 * a: <http://ycombinator.com/lib.html>  (Library)
 * a: <http://www.webmynd.com/html/hackernews.html>  ()
 * a: <http://mixpanel.com/?from=yc>  ()


五、数据修改

5.1、设置属性值

  1)存在问题   

    在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。

  2)方法 

    可以使用属性设置方法 Element.attr(String key, String value), 和 Elements.attr(String key, String value).

    假如你需要修改一个元素的 class 属性,可以使用 Element.addClass(String className) 和 Element.removeClass(String className) 方法。

    Elements 提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个 rel="nofollow" 可以使用如下方法:

    doc.select("div.comments a").attr("rel", "nofollow");

  3)说明

    与Element中的其它方法一样,attr 方法也是返回当 Element (或在使用选择器是返回 Elements 集合)。

    这样能够很方便使用方法连用的书写方式。比如:

    doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");

5.2、设置一个元素的HTML内容

  1)存在问题

    你需要一个元素中的HTML的内容

  2)方法

    可以使用Element中的HTML设置方法具体如下:



Element div = doc.select("div").first(); // <div></div>
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");//在div前添加html内容
div.append("<p>Last</p>");//在div之后添加html内容
// 添完后的结果: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>
 
Element span = doc.select("span").first(); // <span>One</span>
span.wrap("<li><a href='http://example.com/'></a></li>");
// 添完后的结果: <li><a href="http://example.com"><span>One</span></a></li>


  3)说明

    Element.html(String html) 这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。
    Element.prepend(String first) 和 Element.append(String last) 方法用于在分别在元素内部HTML的前面和后面添加HTML内容
    Element.wrap(String around) 对元素包裹一个外部HTML内容

url爬虫文章、、https://blog.csdn.net/qq_28055429/article/details/52047347、

url爬虫框架,,http://webmagic.io/docs/zh/posts/ch1-overview/architecture.html

如果有什么不懂可以加入qq群讨论讨论:668535367

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值