视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用Jsoup解析HTML页面
2025-09-24 00:08:15 责编:小OO
文档
在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。

Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。

示例:

//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", "http://www.example.com/");

//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)

下面举个列子,通过Jsoup抽取出一个DIV块里的所有链接地址。html文本如下:

测试

测试连接

链接地址一

链接地址二

Android java代码如下:

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

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

Elements divs = doc.select("div.my div");

StringBuilder linkBuffer = new StringBuilder();

if (divs != null) {

    for (Element div : divs) {

        Elements links = div.select("a[href]");

        if (null != links) {

            for (Element link : links) {

                linkBuffer.append(link.attr("abs:href"));//相对地址会自动转成绝对url地址

                linkBuffer.append(" ");

                linkBuffer.append(link.text());

            }                                    

        }                                

    }

}

对于Jsoup更详细的信息,可以看官网的文档。http://www.open-open.com/jsoup

以上代码在Android 1.6及以上版本的手机上测试通过。

注意事项:

如果手机是通过wap方式联网,有可能需要设置http proxy,设置方式如下(代码放置在Jsoup.connect调用之前):

String host = android.net.Proxy.getDefaultHost();

int port = android.net.Proxy.getDefaultPort();

if (host != null && port != -1) {

    System.getProperties().setProperty("proxySet", "true");

    System.setProperty("http.proxyHost", host);

    System.setProperty("http.proxyPort", Integer.toString(port));

}

Jsoup进阶之获取指定数据

使用Jsoup解析html中的指定数据,十分方便。Jsoup工具十分强大,十分好用。但网上似乎没有很好的例子,本文的目的即在于此。建议仔细阅读代码中的几个例子,Jsoup解析数据不外乎这几种类型。

第一步:将Jsoup JAR包导入项目

第二步:使用Jsoup API

1, 定位

通过div的属性值,定位到html的div(块),即所需要内容对应的块。

示例代码如下:

 

1. class="content"> 

2. 

2, 筛选数据

a, 通过标签头,在div中继续筛选数据。可能会找到很多的数据,这里会用到循环。见eg1。

 

1.//eg1:解析百度音乐 

2.            Document doc = Jsoup.connect("http://list.mp3.baidu.com/top/singer/A.html").get(); 

3.            Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first(); 

4.            Elements links = singerListDiv.getElementsByTag("a"); 

5.             

6.            for (Element link: links) { 

7.                String linkHref = link.attr("href"); 

8.                String linkText = link.text().trim(); 

9.                System.out.println(linkHref);  

10.            } 

b, 通过标签名,在div中筛选数据,选中此标签内的所有数据。见eg2

 

1.//eg2:解析万年历 

2.        Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get(); 

3.        Element infoTable = doc.getElementsByAttributeValue("class", "table002").first(); 

4.        Elements tableLineInfos = infoTable.select("tr"); 

5.        for (Element lineInfo : tableLineInfos) { 

6.            String lineInfoContent = lineInfo.select("td").last().text().trim(); 

7.            System.out.println("jsoup is :" + lineInfoContent); 

8.        } 

c, 限定筛选条件。如果eg5

 

1.//eg5:查找html元素 

2.        File input = new File("/tmp/input.html"); 

3.        Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/"); 

4.        Elements links = doc.select("a[href]"); // 链接 

5.        Elements pngs = doc.select(); // 所有 png 的图片 

6.        Element masthead = doc.select("div.masthead").first();// div with class=masthead 

7.        Elements resultLinks = doc.select("h3.r > a"); // direct a after h3 

NOTE: 二月15日
壬辰年
癸卯月
丁卯日

此处不能直接单独获得三组数据,获得的是总的三个数据。可通过正则表达式分解

3, 获取数据

即element.text()即可获得相关数据

 

plus: Jsoup有灵活的语法,比如通过class-value对指定div块,可通过select(div.value)找到,更多用法请参考文档! 

 

 

以下给出所有示例代码:

 

    package com.mike.activity; 

     

    import java.io.File; 

    import java.io.IOException; 

     

    import org.jsoup.Connection; 

    import org.jsoup.Jsoup; 

    import org.jsoup.nodes.Document; 

    import org.jsoup.nodes.Element; 

    import org.jsoup.select.Elements; 

     

    import android.app.Activity; 

    import android.os.Bundle; 

    import android.util.Log; 

    import android.view.View; 

    import android.widget.TextView; 

     

    public class JsoupDemoActivity extends Activity { 

        /** Called when the activity is first created. */ 

         

        private StringBuilder sb ; 

         

         

        @Override 

        public void onCreate(Bundle savedInstanceState) { 

            super.onCreate(savedInstanceState); 

            setContentView(R.layout.main); 

             

            sb = new StringBuilder(); 

            TextView textView = (TextView) findViewById(R.id.textView1); 

             

            try { 

    //          //eg1:解析百度音乐 

    //          Document doc = Jsoup.connect("http://list.mpbaidu.com/top/singer/A.html").get(); 

    //          Element singerListDiv = doc.getElementsByAttributeValue("class", "content").first(); 

    //          Elements links = singerListDiv.getElementsByTag("a"); 

    //           

    //          for (Element link: links) { 

    //              String linkHref = link.attr("href"); 

    //              String linkText = link.text().trim(); 

    //              System.out.println(linkHref);  

    //          } 

    //           

    //           

    //          //eg2:解析万年历 

    //          Document doc = Jsoup.connect("http://www.nongli.com/item4/index.asp?dt=2012-03-03").get(); 

    //          Element infoTable = doc.getElementsByAttributeValue("class", "table002").first(); 

    //          Elements tableLineInfos = infoTable.select("tr"); 

    //          for (Element lineInfo : tableLineInfos) { 

    //              String lineInfoContent = lineInfo.select("td").last().text().trim(); 

    //              System.out.println("jsoup is :" + lineInfoContent); 

    //          } 

                 

                 

                //eg3:解析指定段落的内容----注意此代码中的语法: 

    //          Document doc = Jsoup.connect("http://passover.blog.51cto.com").get(); 

    //          Elements divs = doc.select("div.artHead"); 

    //          for (Element div: divs) { 

    //              System.out.println(div.select("h3[class=artTitle]")); 

    //          } 

                 

                //eg4: 

    //          Document doc = Jsoup.connect("http://passover.blog.51cto.com").get(); 

                 

                 

                 

    //          //eg5:查找html元素 

                File input = new File("/tmp/input.html"); 

                Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/"); 

                Elements links = doc.select("a[href]"); // 链接 

所有 png 的图片 

                Element masthead = doc.select("div.masthead").first();// div with class=masthead 

Elements resultLinks = doc.select("hr > a"); // direct a after h3

                 

                 

    //          //test 

    //          File input = new File("D:/test.html");  

    //           Document doc = Jsoup.parse(input,"UTF-8

                 

                 

                /* 

                 * 项目数据准备 

                 */ 

                 

                //eg5:万年历:http://www.zdic.net/nongli/2012-3-htm 

                 

                //data1:dayFav(宜) 

    //          Document doc = Jsoup.connect("http://www.zdic.net/nongli/2012-3-htm").get(); 

    //          Element dayFav = doc.getElementsByAttributeValue("class", "ly2").first(); 

    //          Elements dayFavItems = dayFav.getElementsByTag("a"); 

    //          for (Element dayFavItem:dayFavItems) { 

    //              System.out.println(dayFavItem.text()); 

    //          } 

                 

                //data2:dayUnfav(忌) 

    //          Element dayUnfav = doc.getElementsByAttributeValue("class", "lj2").first(); 

    //          Elements dayUnfavItems = dayUnfav.getElementsByTag("a"); 

    //          for (Element dayUnfavItem:dayUnfavItems) { 

    //              System.out.println(dayUnfavItem.text()); 

    //          } 

                 

                //data3:taiSheng(胎神) 

    //          Element taiSheng = doc.getElementsByAttributeValue("class", "lts2").first(); 

    //          System.out.println(taiSheng.text()); 

                 

                //data4:chong sha(冲煞信息) 

    //          Element chong = doc.getElementsByAttributeValue("class", "lcs").first(); 

    //          Element sha = doc.getElementsByAttributeValue("class", "lcs").get(1); 

    //          System.out.println(chong.text()); 

    //          System.out.println(sha.text()); 

                 

                //data5:zhengChong(正冲)和zhiXing(值星) 

    //          Element zhengChong = doc.getElementsByAttributeValue("class", "lzc2").first(); 

    //          Element zhiXing = doc.getElementsByAttributeValue("class", "lzx2").first(); 

    //          System.out.println(zhengChong.text()); 

    //          System.out.println(zhiXing.text()); 

                             

                 

                //data6:godFav(吉神宜趋) 

    //          Element godUnfav = doc.getElementsByAttributeValue("class", "js2").first(); 

    //          System.out.println(godUnfav.text()); 

                 

                //data7:godUnfav(凶神宜忌) 

    //          Element godFav = doc.getElementsByAttributeValue("class", "xs2").first(); 

    //          System.out.println(godFav.text()); 

                 

                //data8:pengZuBaiJi(彭祖百忌) 

    //          Element pengZuBaiJi = doc.getElementsByAttributeValue("class", "pz2").first(); 

    //          System.out.println(pengZuBaiJi.text()); 

                 

                //data9:wuXing(五行) 

    //          Element wuXing = doc.getElementsByAttributeValue("class", "wuh2").first(); 

    //          System.out.println(wuXing.text()); 

                 

                 

                 

            } catch (IOException e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } 

             

             

        } 

    }

Jsoup网页内容抓取分析

 在Java 程序在解析HTML 文档时,大家应该晓得htmlparser 这个开源项目,我也是使用过,不过这个程序到了2006年就没有更新了。由于我的基础较差,对于扩展自定义的标签还是不太懂,还是有超时问题困扰,偶然的机会中发现有jsoup,而且更新到了1.72版,使用起来还是很容易上手的。下面写些使用心得:

        jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jquery-like methods.

       jsuop是一款java的html解析器,提供一套非常省力的API,通过dom模型css和类似于jquery的方式来获取和操作数据。

      功能:1.解析一个Html文档,2.解析一个body片段

       

Java代码  

1.String html = "First parse"  

2.  + "

Parsed HTML into a doc.

";  

3.Document doc = Jsoup.parse(html);//分析文档,使用doc.toString()可以转为文本  

4.Element body=doc.body();//获取body片段,使用body.toString()可以转为文本  

     

      获取方式:1.从本地文件加载   2.根据url地址获取

 

     

Java代码  

1./**使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法 

2. *其中baseUri参数用于解决文件中URLs是相对路径的问题。 

3. *如果不需要可以传入一个空的字符串。 

4. */  

5.File input = new File("/tmp/input.html");  

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

  

Java代码  

1./** 

2. *根据url直接获取内容,可以加入超时,get方法不行,就用post方法 

3. *我在实际应用中,出现404,405,504等错误信息 

4. *将get改为post就可以,或者反过来改 

5. *如果等以后弄明白了,再来解释清楚 

6. */  

7.Document doc1 = Jsoup.connect("http://www.hao123.com/").get();  

8.String title = doc1.title(); //获取网页的标题  

9.String content=doc1.toString();//将网页转为文本  

10.  

11.Document doc2 = Jsoup.connect("http://www.hao123.com")  

12.  .data("query", "Java")//请求参数  

13.  .userAgent("Mozilla")//设置urer-agent  

14.  .cookie("auth", "token")//设置cookie  

15.  .timeout(50000)//设置连接超时  

16.  .post();//或者改为get  

 

  针对上一篇写的内容很简单,只是给大家抛出了有一个工具可以用来分析网页的内容,做java搜索爬虫使用,实际的使用并没有怎么介绍,现在这篇文章就来介绍一下用法,可能分析的不是很全面,欢迎批评。经过我的测试使用,jsoup分析网页结构和内容的功能远远强大于HtmlParser,无论是获取整个页面的文本,还是分析特定内容的网页结构,都是十分的方便。

 

        附上链接:jsoup官网:http://jsoup.org/ ,中文jsoup:http://www.open-open.com/jsoup/

     下面写些我的使用记录,希望大家如果能从我的方法中得到启发,鉴于本人从事开发工作不久,内容可能写的不是很好。

 

     jsoup数据获取有两大方法:1.通过分析dom模型的网页标签和元素,2.select元素选择器,类似jquery方式(功能很强大,还支持正则表达式)。网页tag标签有body,div,table,tr,td,a,等等。元素的属性有,href,title,width,height,color等等,元素属性的值就是,例如:href=“www.baidu.com”, 值就是www.baidu.com 。width=“98%” 值就是98%

     

      下面就以分析http://www.iteye.com首页的每日资讯为例,抓取每日资讯的标题和url地址,详细写出分析步骤:

 

       1.用chrome浏览器的元素审查,分析页面的结构,得到每日资讯是div class=层里面

 

     2.写程序分析,首先根据url获取div文本,再来根据文本对内容进行分析

 

Java代码  

1./** 

2. * 根据jsoup方法获取htmlContent 

3.        * 加入简单的时间记录 

4. * @throws IOException  

5. */  

6.public static String getContentByJsoup(String url){  

7.    String content="";  

8.    try {  

9.        System.out.println("time=====start");  

10.        Date startdate=new Date();  

11.        Document doc=Jsoup.connect(url)  

12.        .data("jquery", "java")  

13.        .userAgent("Mozilla")  

14.        .cookie("auth", "token")  

15.        .timeout(50000)  

16.        .get();  

17.        Date enddate=new Date();  

18.        Long time=enddate.getTime()-startdate.getTime();  

19.        System.out.println("使用Jsoup耗时=="+time);  

20.        System.out.println("time=====end");  

21.        content=doc.toString();//获取iteye网站的源码html内容  

22.        System.out.println(doc.title());//获取iteye网站的标题  

23.    } catch (IOException e) {  

24.        e.printStackTrace();  

25.    }  

26.    System.out.println(content);   

27.    return content;  

28.}  

 

     3. 根据整个每日资讯所在的div层,获取那段内容(精确获取)

 

Java代码  

1.       /** 

2. * 使用jsoup来对文档分析 

3.        * 获取目标内容所在的目标层 

4.        * 这个目标层可以是div,table,tr等等 

5. */  

6.public static String getDivContentByJsoup(String content){  

7.    String divContent="";  

8.    Document doc=Jsoup.parse(content);  

9.    Elements divs=doc.getElementsByClass("main_left");  

10.    divContent=divs.toString();  

11.      //System.out.println("div==="+divContent);  

12.    return divContent;  

13.}  

    

     4.根据获取的目标层得到你所要的内容(title,url地址...等等)

 

      

Java代码  

1./** 

2.     * 使用jsoup分析divContent 

3.     * 1.获取链接 2.获取url地址(绝对路径) 

4.     */  

5.    public static void getLinksByJsoup(String divContent){  

6.        String abs="http://www.iteye.com/";  

7.        Document doc=Jsoup.parse(divContent,abs);  

8.        Elements linkStrs=doc.getElementsByTag("li");  

9.        System.out.println("链接==="+linkStrs.size());  

10.        for(Element linkStr:linkStrs){  

11.            String url=linkStr.getElementsByTag("a").attr("abs:href");  

12.            String title=linkStr.getElementsByTag("a").text();  

13.            System.out.println("标题:"+title+" url:"+url);  

14.        }  

15.    }  

 

     5.加入main方法里面执行测试

 

Java代码  

1./** 

2.     * @method 测试获取内容程序 

3.     */  

4.    public static void main(String[] args) throws IOException {  

5.          

6.        /** 

7.         * 执行分析程序 

8.         */  

9.        String url="http://www.iteye.com/";  

10.        String HtmlContent=getContentByJsoup(url);  

11.        String divContent=getDivContentByJsoup(HtmlContent);  

12.        getLinksByJsoup(divContent);  

13.    }  

 

     6.附上结束语:jsoup功能很好很强大,附上的只是简单的使用方法,还有很多需要完善的内容,我其实使用也不到几天的时间。还有就是select功能还是很好用的,具体参考官方文档,写的非常的通俗易懂!附上程序源码和jsoup的jar包下载本文

显示全文
专题