最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

使用Jsoup解析HTML页面

来源:动视网 责编:小OO 时间:2025-09-24 00:08:15
文档

使用Jsoup解析HTML页面

在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。示
推荐度:
导读在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。示
在写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包

文档

使用Jsoup解析HTML页面

在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。示
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top