使用Jsoup提取HTML元素,修改HTML内容

来源:互联网 发布:数据集市的主题域 编辑:程序博客网 时间:2024/05/16 11:54

Jsoup是一个开源的,专门处理HTML内容的强大工具,下载地址+中文文档地址:http://www.open-open.com/jsoup/。最初开始使用时,由于对网页前端知之甚少,并未感受到Jsoup在编程中处理web的强大。最近几次帮同学写小的网页爬虫时,才感受到它的强大,它所提供的类似jQuery语法的选择器,谁用谁知道!

Jsoup初始由Java编写而成,当然也有其他的语言版本。如C#版本的Nsoup,Python版本的BeautifulSoup(还真是优雅的叫法呢ORz)。


下面从几个使用场景来介绍下Jsoup。当然会有实例教程啦。既然前面讲到是类似jQuery的语法选择,所以有一个非常必要的参考网址是jQuery选择器文档:http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 。


1.加载HTML文档

         加载HTML文档,即,将网络上的网页,或本地的html用Jsoup方便处理的一个对象存储起来,方便进行后续的操作。存储这个对象的类就是Document(不是java.io包里的Document而是org.jsoup.Document的说~)

1.1加载网络上的HTML文档:Jsoup.connect(url)

如果没猜错的话,Jsoup内置应该有一个HttpClient(就是方便大家联网抓网页的工具)的实现。使用Jsoup.connect(url)的静态方法可以联网获取网页。

所以加载网络上的HTML文档有一个固定的模式:

        Document  doc = Jsoup.connect("http://tieba.baidu.com).get()

     

1.2加载本地文件:Jsoup.parse(String html),Jsoup.parse(File f)

         那加载这个磁盘上的文档或内存中的字符串就是

         Document  doc = Jsoup.parse(new File(path))  或   Document  doc = Jsoup.parse(html)


2.选取你想要的元素或者文本:select()方法,attr()等方法。

这一部最好还是有一些HTML和js的基础,如果没有也没有关系,呐,http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 现场去了解一下html文档中的几类中药属性。比如标签(a标签啦,p标签),比如属性(href属性,就是通常说的链接,什么src属性啊,class,id)等等乱七八糟的。

经验表明= =没有任何HTML基础的同学在运用Jsoup时效率往往是很低的,选取元素多是采用“猜”的方式。不过话说猜多了,也对HTML一些基本东西就搞明白了。嗯,可能有的开发者也意识到这个问题了,给了一个专门供大家猜的工具:http://try.jsoup.org/ 这是一个select()方法的活生生的教材,拿不准的时候不妨多在这里试几把。


2.1选取一个具有某个特征的所有标签元素

选取一个网页中的某个标签用Jsoup真是炒鸡简单呐,document.select("tag"),或element.select("tag")即选取了当前文档(document)或当前元素(element)中所有tag标签的全部内容,注意是所有内容哦,既包括html属性、标签,也包括标签包含的文本。

呐,什么叫标签呢,标签有两种表达形式,以 p标签为例,p括起来的一个元素表示一个文本段落,一个尖括号内部(如下文的class,id)被称为这个标签的属性(attr)。

        <p>呐,这一个段落</p>

        <p class = 'firstPara'>呐,这是一个段落</p>

        <p id="secondpara"> <a href="http:www.baidu.com"> 呐这是一个段落</a> </p>

        如果使用select(“p")方法就会返回一个Elements对象,这个elements对象里包括了所有由<p>标签括起来的元素。那有的同学会有疑问,如果我只想选取第二段的那个该怎么处理呢?

       问的好= 。=,体现Jsoup强大的一个地方也在这里。我们可以观察到第二段的p标签有一个class属性。那么用Jsoup选取语法就是:

        doc.select("p.firstPara") : 选取文档中 class属性为 firstPara 的所有p标签。

当然你也可以这样:

        doc.select("p[class]") : 选取文档中含有class属性的所有p标签。

        由此你可以看出,tag[attr] 为选取具有attr属性值的所有 tag 标签, 当然,tag[attr = value] 也是允许的。

         .classAttr 是选取class属性值等于classAttr的所有元素。

。。。

      诸如此类很多很多,学习select方法时,个人比较不建议看Jsoup的文档,直接去w3school看jQuery选择器语法才是正道啊!


2.2 获取文字内容或标签内部的属性值

        获取文字内容的方法非常简单 :   .text()   document,element(s)对象均有这个方法,作用便是过滤掉所有的html标签,仅显示其中的正文内容

获取标签内部某些属性值也有非常方便的方法,没错,他就是 element.attr("")。比如有时我们需要获取一个网页中的链接的地址,我明知道,链接地址是通过a标签中的href属性指定的。我们就可以在使用select方法选取到我们需要的位置的a标签后,使用

        elment.attr("href”) 属性获取链接地址。当然,href换成src就成了获取网页引用的资源的地址。

        







0 0