网页解析之Jsoup

来源:互联网 发布:女人八点伴是什么软件 编辑:程序博客网 时间:2024/05/16 16:03

      最近在做一款校园APP,因为服务器不是自己的,所以没有办法提供接口给自己使用。无奈之下只能使用最笨的办法了----解析网页。优点是不用接口也能工作,缺点是浪费流量。不过还好,校内WIFI全覆盖,也不在乎这一点流量了,反正内网访问也不计流量。好了,废话不多,说说我是如何解析网页获得自己需要的内容。

     自己百度了一下,比较好用的一个开源项目是Jsoup,感谢开源项目。虽然在网上也可以直接获取到Jsoup的官方的使用说明,但是这里还是将我的理解和用法记录一下。

     Jsoup功能非常强大,可以解析一个完整的网页,当然了,也可以解析一个网页的一部分,还可以解析一个字符串,文本。具体使用可以参考使用文档,这里我主要讲解如何解析一个完整的网页。

     1.获取网页的数据

            HttpClient client = new DefaultHttpClient();         //实例化一个httpclient

            HttpGet get = new HttpGet(htmlUrl);       //实例化一个httpget method

           HttpResponse response = client.execute(get);  //执行get

           htmlStr = EntityUtils.toString(response.getEntity());  //获得网页数据 保存成一个String 方便打印查看和后面的解析

   2.开始对网页数据进行解析 

        Jsoup将要解析的内容抽象成一个Document,可以理解为将一个网页在内存中的存放抽象成一个Document.

             Document doc = Jsoup.parse(htmlStr);  通过Jsoup的静态方法,将输入的String预先解析成一个Document对象。之后,对该网页中所有的目标数据的查找都在该Document中进行。下面是原网页的部分代码,讲解主要依次为依据。

<font size="3" color="#FF0000">   <span style="color:#330000;"><TD <span style="color:#FF0000;">class="login"</span> align="center">      <span style="color:#FFFF00;"><span style="color:#993399;"><DIV</span> </span><span style="color:#FF0000;">class="Login"</span>>      <DIV <span style="color:#FF0000;">class="Bar_BG"</span>><DIV class="Bar_Title">用户登录</DIV></DIV><span style="color:#3333FF;"><form action="/modules/swyh/servlet/login" method="post"></span><span style="color:#3333FF;"><input type="hidden" name="vcv" value="a00qq0dbp001dnf49755b63p5418953i" /></span><TABLE class="LoginInput"><TBODY><tr><td colspan="2" class="errmsg"> </td></tr><tr><td align=right>帐号:</td><td align=left><input class="TUser" type="text" size="16" name="account" value=""/></td></tr><tr><td align=right>密码:</td><td align=left><input class="TPWD"  type="password" size="16" name="password" /></td></tr><span style="color:#009900;"><tr><td align=right>验证码:</td><td align=left valign="middle"><input class="TCode"  type="text" size="16" name="vcode" /><img class="vcimg" src="/modules/swyh/servlet/getcodeimage?vcv=a00qq0dbp001dnf49755b63p5418953i"</span> tips="看不清换一张" /></td></tr>    <tr><td colspan="2" align="center"><input type="submit" value="登录" /></td></tr></TBODY></TABLE></form>      <span style="color:#993399;"></DIV></span>    </TD></span></font>
其中要说道的已经标注了颜色。首先说一下基本概念。在上面的代码中可以看到类似'<TD...“”<DIV.."这是都是网页描述中的一些标签头,可以不用理解。具体的html语言,可以自行查阅。下面说重要的。

    1)在Jsoup中将需要解析的内容抽象成一个Document,在解析过程中查找的任何一个内容都抽象成Element.Document提供了如下几个函数。

        getElementById(String id)  //通过一个Id查找元素。
        getElementsByTag(String tag)  //通过一个tag查找元素
        getElementsByClass(String className)  //通过一个类名查找元素
        getElementsByAttribute(String key)  //通过一个属性查找元素

       这里要说明,不好意思,我不知道Id是个什么东西。所以,就没用,其实也没用上,因为后面三个函数已经解决了所以我的问题。知道的给我讲讲,对html不是很了解。

      getElementsByTag(String tag)  顾名思义,通过一个tag段标记查找元素,那什么是tag,这个html的语法,可以百度一下,一般来说以"<"开头到">"结束就表示一个tag.例如第一行“<TD class="login" align="center">”就是一个tag标记的内容。那么这个tag的名字就叫"TD",所以如果需要找这一行就是用doc.getElementById("TD");

     同理,getElementByClass(String className)就表示通过一个类名来寻找一个元素,从上面很轻松看到一个class对不对?---“<DIV class="Login">",那么这个类名也就是Login,当然了这个类的内容绝不是这一行,而是与之相对于的

<span style="font-size:14px;"></DIV>之间所有的内容。也就是两个紫色之间的内容代表一个Login类。如果解析就是用一下语句:<span style="font-size:18px;"><span style="font-size:18px;">getElementByClass("</span></span></span><span style="font-size:14px;">Login</span><span style="font-size:14px;"><span style="font-size:18px;"><span style="font-size:18px;">")</span></span>;</span>

   最后也就是 getElementsByAttribute(String key)  //通过一个属性查找元素了。什么是属性?如下:

<form action="/modules/swyh/servlet/login" method="post">

在这句话中 action的属性值就是"/modules/swyh/servlet/login"method的属性值就是"post",那么action 和 method就是form这个
tag的属性。所以使用getElementsByAttribute() ,就可以解析到所有有aciton属性的元素了。
   
对了,忘掉一个细节,那就是这些函数返回的不是一个Element而是一系列的Elements所以,我们需要哪个Element还需要
使用get函数获取我们需要的,通常的网页不变化不大,搭配着使用上面的函数就可以获取我们需要的Element.
  当然了也可以使用select方法进行暴力查找,只要存在就没有找不到的,Document的Elements.select(String selector)
找到包含我们需要的的Element,一般最小的Element单位都是一个tag,<span style="color:#FF0000;">实验的时候好像是查找的tag.也就是每一行的开头。
当然了,select在Element和Elements中都是
可以使用的,因此可实现指定元素的过滤。非常给力。
       Element Login = doc.getElementsByClass("Login").first();
        htmlInfo.setVcv(Login.select("input").first().attr("value"));
        htmlInfo.setImgSrc(Login.select("img").first().attr("src"));
    以上代码就是为了从上面的网页数据中解析到Login,然后从Login中获得input的value属性的值。同时获取Login中的
img所在的端,获取attr属性的值。
最后一个函数就是Element.text()用于获取一个元素中的文本内容。比如:<DIV class="Bar_Title">用户登录</DIV>就可以获得"用户登录”内容。

好了今天就写这么多了。








0 0
原创粉丝点击