Jsoup解析HTML

合集下载

在Android程序中使用Jsoup技术解析HTML

在Android程序中使用Jsoup技术解析HTML

在Android程序中使用Jsoup技术解析HTML时,在模拟器中可以正常运行,但是在真机中运行时,却出现异常,主要原因如下:当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程。

其他线程叫工作线程(Work Thread)。

Single Thread Model∙一个组件的创建并不会新建一个线程,他们的创建都在UI线程中进行,包括他们的回调方法,如onKeyDown()。

∙当在UI线程中进行某些耗时的操作时,将会阻塞UI线程,一般阻塞超过5秒就会显示一个ANR对话框。

∙UI线程是非线程安全的,所以,不能在工作线程中操作UI元素。

两个原则∙Do not block the UI thread (不要阻塞UI线程)∙Do not access the Android UI toolkit from outside the UI thread (不要在工作线程中操作UI元素)在工作线程更新UI方法∙Activity.runOnUiThread(Runnable)∙Handler∙sendMessage(Message)∙post(Runnable)∙AsyncTask∙execute()∙doInBackground()∙onPostExecute()下面通过一个案例来说明使用Jsoup技术解析HTML。

1.创建Android项目:Android解析HTML2.导入jsoup-1.7.3.jar到项目的libs目录中。

3.创建HTML2Activity.java4.布局文件activity_html2.xml内容如下:<RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".HTML2Activity"><ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="14dp"></ListView></RelativeLayout>5.HTML2Activity.java文件内容如下:package cn.changxin.sfw.html;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import android.os.AsyncTask;import android.os.Bundle;import android.app.ListActivity;import android.app.ProgressDialog;import android.util.Log;import android.view.Menu;import android.widget.ListView;import android.widget.SimpleAdapter;public class HTML2Activity extends ListActivity {private ListView listView;private List<Map<String,String>> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_html2);listView=this.getListView();//调用异步任务Loadhtml load=new Loadhtml();load.execute();}//异步获取信息class Loadhtml extends AsyncTask<String, String, String>{ProgressDialog dialog;Document doc;@Overrideprotected String doInBackground(String... params) {// TODO Auto-generated method stubtry {doc = Jsoup.connect(Address).timeout(5000).post();Document content = Jsoup.parse(doc.toString());//获取页面中ID为siteNav的divElements divs = content.select("#siteNav");//解析divs标记Document divcontions = Jsoup.parse(divs.toString());//获取divs中所有li标记Elements elements = divcontions.getElementsByTag("li");Log.d("element", elements.toString());list=new ArrayList<Map<String,String>>();//获取所有elements中a标记的文本及链接地址,构成map集合,并将map添加list 中for(Element e:elements){Map<String,String> map=new HashMap<String,String>();map.put("title", e.getElementsByTag("a").text());map.put("href", Address+e.getElementsByTag("a").attr("href"));list.add(map);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);Log.d("doc", doc.toString().trim());//对话框关闭dialog.dismiss();//将list数据绑定到listViewlistView.setAdapter(new SimpleAdapter(HTML2Activity.this,list,yout.simple_list_item_2,new String[]{"title","href"},new int[]{android.R.id.text1,android.R.id.text2}));//将网页标题显示到手机页面标题位置HTML2Activity.this.setTitle(doc.title());}@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();//实例为对话框dialog = new ProgressDialog(HTML2Activity.this);dialog.setMessage("正在加载数据····");//progressDialog.setIndeterminate(true);//是进度条是否明确不明确就是滚动条的当前值自动在最小到最大值之间来回移动,//形成这样一个动画效果,这个只是告诉别人“我正在工作”,但不能提示工作进度到哪个阶段。

【Jsoup】Jsoup解析Html标签(Java后台解析)

【Jsoup】Jsoup解析Html标签(Java后台解析)

【Jsoup】Jsoup解析Html标签(Java后台解析) 中⽂API⽹站(下载地址): 有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成⼀个完整的Html⽂档,也或者需要解析其中的⽂字(text()),Java后台处理⽤Jsoup⾮常⽅便,也可以⽤选择器快速获取元素,类似于jQuery。

获取到⽂档对此之后对其处理与JS处理DOM⼀样⽅便,选取元素也类似于JS,也有类似于jQuery的语法,官⽅的解释1.最基本的解析Html字符串@Testpublic void testHtmlToString2() {String html = "<p>这是⼀个段落<img src=\"test.img\"/>内容;</p>";Document doc = Jsoup.parse(html);System.out.println(doc); // 输出带标签的html⽂档System.out.println("---------------------\n"+doc.text()); // 输出内容Elements element = doc.getElementsByTag("p");System.out.println("---------------------\n"+element.get(0).html());}结果:<html><head></head><body><p>这是⼀个段落<img src="test.img">内容;</p></body></html>---------------------这是⼀个段落内容;---------------------这是⼀个段落<img src="test.img">内容;2.解析字符串// 解析html字符串@Testpublic void testHtmlToString() {String html = "<html><head><title>First parse</title></head>"+ "<body><p style='center'>Parsed HTML into a doc.</p></body></html>";Document doc = Jsoup.parse(html);System.out.println(doc); // 输出带标签的html⽂档System.out.println("---------------------\n"+doc.text()); // 输出内容}结果:<html><title>First parse</title></head><body><p style="center">Parsed HTML into a doc.</p></body></html>---------------------First parse Parsed HTML into a doc.3.// 解析body⽚段@Testpublic void test2() {String html = "<div><p>Lorem ipsum.</p>";Document doc = Jsoup.parseBodyFragment(html);System.out.println(doc);System.out.println(doc.text());}结果:<html><head></head><body><div><p>Lorem ipsum.</p></div></body></html>Lorem ipsum.4.// 解析⼀个url与⽤选择器选择元素(相当于查看源码)@Testpublic void test4() throws IOException {Document doc = Jsoup.connect(":8080/").get();String title = doc.title();// 获取titleSystem.out.println(title);System.out.println("---------------------\n"+doc.toString()+"---------------------\n");// 输出⽂档全部 Elements links = doc.getElementsByTag("a");for (Element ele : links) {System.out.println(ele.toString());}}Apache Tomcat/7.0.72---------------------<!doctype html><html lang="en"><head><title>Apache Tomcat/7.0.72</title><link href="favicon.ico" rel="icon" type="image/x-icon"><link href="favicon.ico" rel="shortcut icon" type="image/x-icon">..........5.选择器解析HTML并且提取input的value值:(获取元素的属性)* <span class="bigNum">⼆</span>、* <span><input class="el_modifiedTitle" value="多选题" type="text"> </span>* <span>(每到题 <input class="el_modifiedGrade" value="2" type="text"> </span>* <span> 分;共</span><span class="numTotal">4分/</span>* <span class="numQues">2题)</span>** @param html* @return*/// 去掉⼤题的标签public static String removeBigQues(String html) {StringBuffer sb = new StringBuffer();Document doc = Jsoup.parse(html);System.out.println(doc);System.out.println(doc.text());sb.append(doc.select(".bigNum").get(0).text() + ". ");sb.append(doc.select(".el_modifiedTitle").get(0).attr("value"));sb.append(doc.select("span").get(2).text() + doc.select(".el_modifiedGrade").get(0).attr("value"));sb.append(doc.select("span").get(3).text());sb.append(doc.select("span").get(4).text());sb.append(doc.select("span").get(5).text());System.out.println(sb.toString());return sb.toString();}补充:今天发现Jsoup竟然没有解析元素style的⽅法,所以只能⾃⼰⼿写 先获取到style属性,再对style属性进⾏处理,例如:String style = "position: absolute; width: 500px; height: 552px;";String extract = "width";if (style.contains(extract)) {style = style.substring(style.indexOf(extract));System.out.println(style);style = style.substring(0, style.indexOf(";"));System.out.println(style);String attr = style.substring(style.indexOf(":") + 2);System.out.println(attr.substring(0, attr.indexOf("px")));}补充:元素的html()与outerHtml()的区别 html()会返回包括⼦元素的内容以及标签,不包括⾃⼰ outerHtml()会返回包括⾃⼰在内的元素。

使用jsoup对 HTML文档进行解析和操作

使用jsoup对 HTML文档进行解析和操作

使用jsoup对HTML文档进行解析和操作刘柄成,站长,开源中国社区简介jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。

它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

本文主要介绍如何使用jsoup来进行常用的HTML解析。

jsoup的主要功能如下:从一个URL,文件或字符串中解析HTML;使用DOM或CSS选择器来查找、取出数据;可操作HTML元素、属性、文本;jsoup是基于MIT协议发布的,可放心使用于商业项目。

jsoup的主要类层次结构如图1所示:图 1.jsoup的类层次结构接下来我们专门针对几种常见的应用场景举例说明jsoup是如何优雅的进行HTML文档处理的。

文档输入jsoup可以从包括字符串、URL地址以及本地文件来加载HTML文档,并生成Document 对象实例。

下面是相关代码:清单1//直接从字符串中输入HTML文档String html="<html><head><title>开源中国社区</title></head>"+"<body><p>这里是jsoup项目的相关文章</p></body></html>";Document doc=Jsoup.parse(html);//从URL直接加载HTML文档Document doc=Jsoup.connect("/").get();String title=doc.title();Document doc=Jsoup.connect("/").data("query","Java")//请求参数.userAgent("I’m jsoup")//设置User-Agent.cookie("auth","token")//设置cookie.timeout(3000)//设置连接超时时间.post();//使用POST方法访问URL//从文件中加载HTML文档File input=new File("D:/test.html");Document doc=Jsoup.parse(input,"UTF-8","/");请大家注意最后一种HTML文档输入方式中的parse的第三个参数,为什么需要在这里指定一个网址呢(虽然可以不指定,如第一种方法)?因为HTML文档中会有很多例如链接、图片以及所引用的外部脚本、css文件等,而第三个名为baseURL的参数的意思就是当HTML文档使用相对路径方式引用外部文件时,jsoup会自动为这些URL加上一个前缀,也就是这个baseURL。

JSoup

JSoup

DOM树的遍历
在DOM树的遍历上,用到了NodeVisitor和NodeTraversor来对树的进行遍历。
1.nodeVisitor public interface NodeVisitor { public void head(Node node, int depth); public void tail(Node node, int depth); }
1、HTML相关知识
HTML Tag可以分为block和inline两类。
2、Jsoup的格式化实现
在Jsoup里,直接调用Document.toString()(继承自Element),即可对文档进行输出。 另外OutputSettings可以控制输出格式,主要是prettyPrint(是否重新格式化)、 outline(是否强制所有标签换行)、indentAmount(缩进长度)等。
• 父节点parentNode以及子节点childNodes 的引用 • 属性值集合attributes • 页面的uribaseUri,用于修正相对地址为绝 对地址 • 在兄弟节点中的位置siblingIndex,用于进 行DOM操作
在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)。

Jsoup解析HTML实例及文档方法详解

Jsoup解析HTML实例及文档方法详解

Jsoup解析HTML实例及文档方法详解解析和遍历一个HTML文档如何解析一个HTML文档:复制代码代码如下:String html = "&lt;html&gt;&lt;head&gt;&lt;title&gt;First parse&lt;/title&gt;&lt;/head&gt;"+ "&lt;body&gt;&lt;p&gt;Parsed HTML into adoc.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;";Document doc = Jsoup.parse(html);其解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。

比如它可以处理:1、没有关闭的标签(比如:&lt;p&gt;Lorem &lt;p&gt;Ipsum parses to &lt;p&gt;Lorem&lt;/p&gt;&lt;p&gt;Ipsum&lt;/p&gt;)2、隐式标签(比如. 它可以自动将&lt;td&gt;Tabledata&lt;/td&gt;包装成&lt;table&gt;&lt;tr&gt;&lt;td&gt;?)3、创建可靠的文档结构(html标签包含head 和body,在head只出现恰当的元素)一个文档的对象模型1、文档由多个Elements和TextNodes组成(以及其它辅助nodes).2、其继承结构如下:Document继承Element继承Node. TextNode继承Node.3、一个Element包含一个子节点集合,并拥有一个父Element。

Java中使用开源库JSoup解析HTML文件实例

Java中使用开源库JSoup解析HTML文件实例

Java中使⽤开源库JSoup解析HTML⽂件实例HTML是WEB的核⼼,互联⽹中你看到的所有页⾯都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态⽣成的。

你的浏览器会去解析HTML并替你去渲染它们。

不过如果你需要⾃⼰在Java程序中解析HTML⽂档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那⼜该如何呢?如果你已经使⽤Java编程多年了,我相信你肯定试过去解析XML,也使⽤过类似DOM或者SAX这样的解析器,不过很有可能你从未进⾏过任何的HTML解析的⼯作。

更讽刺的是,在Java应⽤中,很少会有需要你去解析HTML⽂档的时候,这⾥并不包括Servlet或者其它的Java WEB技术。

更糟糕的是,JDK核⼼⾥也没有包括HTTP或者HTML的库,⾄少我并不知道有这个。

这就是为什么⼀碰上解析HTML⽂件时,许多Java程序员就得先Google⼀下,看看如何在Java中取出⼀个HTML的标签。

当我有这个需要的时候,我相信肯定会有⼀些开源库能实现这个,不过我没有想到竟然有JSoup这么酷的并且功能齐全的库。

它不仅能⽀持读取并解析HTML⽂档,⽽且还能让你从HTML⽂件抽取出任何的元素,以及它们的属性,它们的CSS属性,你还能进它们进⾏修改。

有了JSoup你简直可以对HTML⽂档做任何事情。

我们将会看到如何在Java中从google主页或者任何URL中下载并解析HTML⽂件的⽰例。

JSoup库是什么Jsoup是⼀个开源的Java库,它可以⽤于处理实际应⽤中的HTML。

它提供了⾮常便利的API来进⾏数据的提取及修改,充分利⽤了DOM,CSS以及jquery风格⽅法的长处。

Jsoup实现了WAHTWG HTML5的规范,它从HTML解析出来的DOM和Chrome以及Firefox这样的现代浏览器解析出来的完全⼀致。

下⾯是Jsoup库的⼀些有⽤的特性:1.Jsoup可以从URL,⽂件,或者字符串中获取并解析HTML。

Java爬虫系列三:使用Jsoup解析HTML

Java爬虫系列三:使用Jsoup解析HTML

Java爬⾍系列三:使⽤Jsoup解析HTML在上⼀篇随笔《》中介绍了怎么使⽤HttpClient进⾏爬⾍的第⼀步--抓取页⾯html,今天接着来看下爬⾍的第⼆步--解析抓取到的html。

有请第⼆步的主⾓:Jsoup粉墨登场。

下⾯我们把舞台交给Jsoup,让他完成本⽂剩下的内容。

============华丽的分割线=============⼀、Jsoup⾃我介绍⼤家好,我是Jsoup。

我是⼀款Java 的HTML解析器,可直接解析某个URL地址、HTML⽂本内容。

它提供了⼀套⾮常省⼒的API,可通过DOM,CSS以及类似于jQuery的操作⽅法来取出和操作数据,⽤Java写爬⾍的同⾏们⼗之⼋九⽤过我。

为什么呢?因为我在这个⽅⾯功能强⼤、使⽤⽅便。

不信的话,可以继续往下看,代码是不会骗⼈的。

⼆、Jsoup解析html上⼀篇中,HttpClient⼤哥已经抓取到了博客园⾸页的html,但是⼀堆的代码,不是程序员的⼈们怎么能看懂呢?这个就需要我这个html解析专家出场了。

下⾯通过案例展⽰如何使⽤Jsoup进⾏解析,案例中将获取博客园⾸页的标题和第⼀页的博客⽂章列表请看代码(在上⼀篇代码的基础上进⾏操作,如果还不知道如何使⽤httpclient的朋友请进⾏阅读):1. 引⼊依赖<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency>2. 实现代码。

实现代码之前⾸先要分析下html结构。

标题是<title>不⽤说了,那⽂章列表呢?按下浏览器的F12,查看页⾯元素源码,你会发现列表是⼀个⼤的div,id="post_list",每篇⽂章是⼩的div,class="post_item"接下来就可以开始代码了,Jsoup核⼼代码如下(整体源码会在⽂章末尾给出):/*** 下⾯是Jsoup展现⾃我的平台*///6.Jsoup解析htmlDocument document = Jsoup.parse(html);//像js⼀样,通过标签获取titleSystem.out.println(document.getElementsByTag("title").first());//像js⼀样,通过id 获取⽂章列表元素对象Element postList = document.getElementById("post_list");//像js⼀样,通过class 获取列表下的所有博客Elements postItems = postList.getElementsByClass("post_item");//循环处理每篇博客for (Element postItem : postItems) {//像jquery选择器⼀样,获取⽂章标题元素Elements titleEle = postItem.select(".post_item_body a[class='titlelnk']");System.out.println("⽂章标题:" + titleEle.text());;System.out.println("⽂章地址:" + titleEle.attr("href"));//像jquery选择器⼀样,获取⽂章作者元素Elements footEle = postItem.select(".post_item_foot a[class='lightblue']");System.out.println("⽂章作者:" + footEle.text());;System.out.println("作者主页:" + footEle.attr("href"));System.out.println("*********************************");}根据以上代码你会发现,我通过Jsoup.parse(String html)⽅法对httpclient获取到的html内容进⾏解析获取到Document,然后document可以有两种⽅式获取其⼦元素:像js ⼀样可以通过getElementXXXX的⽅式和像jquery 选择器⼀样通过select()⽅法。

Java爬虫工具Jsoup详解

Java爬虫工具Jsoup详解

Java爬⾍⼯具Jsoup详解Java 爬⾍⼯具Jsoup详解Jsoup是⼀款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML ⽂本内容。

它提供了⼀套⾮常省⼒的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作⽅法来取出和操作数据。

jsoup 的主要功能如下:1. 从⼀个 URL,⽂件或字符串中解析 HTML;2. 使⽤ DOM 或 CSS 选择器来查找、取出数据;3. 可操作 HTML 元素、属性、⽂本;jsoup 是基于 MIT 协议发布的,可放⼼使⽤于商业项⽬。

jsoup 可以从包括字符串、URL 地址以及本地⽂件来加载 HTML ⽂档,并⽣成 Document 对象实例。

简单⽽⾔,Jsoup就是先取html页⾯代码然后解析这些页⾯通过Jsoup携带的满⾜我们绝⼤多数需求的各种选择器从这个页⾯中获取我们所需要的重要数据的⼀款功能强⼤的html解析器,但也只是相对⽽⾔,这⾥的页⾯这是死的静态页⾯,如果你想获取动态⽣成的页⾯数据那么你得⽤到其他的java 爬⾍技术,我会不定时更新这些技术⼀起探讨。

下⾯我们来具体谈谈如何运⽤Jsoup⼀、如何取页⾯Jsoup提供了⽤来解析html页⾯的⽅法 parse(),我们通过解析它可以获取整个页⾯的dom对象,通过这个对象来获取你所需要的页⾯所须有的参数。

获取页⾯的⽅法有很多,这⾥就简单的列举⼏个:①通过Jsoup携带的connect()⽅法String htmlPage = Jsoup.connect("https://").get().toString();这个⽅法说需要的参数就是⼀个String类型的url链接,但是你的注意把这些链接的protrol加上,以免问题,其实这个⽅法解决了我们很多问题,我们完全可以把Jsoup解析html抽取成⼀段通⽤⼯具类,然后通过改变拼接的url参数获取到很多我们想要的东西,举个例⼦:京东和淘宝的商品链接都是固定的,通过改变其三⽅商品ID来获取商品详情参数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和扩展 HTMLParser 对自定义标签的处理能力。

但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了jsoup 。

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。

它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

jsoup 的主要功能如下:1. 从一个 URL,文件或字符串中解析 HTML;2. 使用 DOM 或 CSS 选择器来查找、取出数据;3. 可操作 HTML 元素、属性、文本;jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。

jsoup 的主要类层次结构如图 1 所示:图 1. jsoup 的类层次结构接下来我们专门针对几种常见的应用场景举例说明 jsoup 是如何优雅的进行HTML 文档处理的。

回页首文档输入jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成Document 对象实例。

下面是相关代码:清单1// 直接从字符串中输入 HTML 文档String html = "<html><head><title> 开源中国社区 </title></head>"+ "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";Document doc = Jsoup.parse(html);// 从 URL 直接加载 HTML 文档Document doc = Jsoup.connect("/").get();String title = doc.title();Document doc = Jsoup.connect("/").data("query", "Java") // 请求参数.userAgent("I ’ m jsoup") // 设置 User-Agent.cookie("auth", "token") // 设置 cookie.timeout(3000) // 设置连接超时时间.post(); // 使用 POST 方法访问 URL// 从文件中加载 HTML 文档File input = new File("D:/test.html");Document doc = Jsoup.parse(input,"UTF-8","/");请大家注意最后一种 HTML 文档输入方式中的 parse 的第三个参数,为什么需要在这里指定一个网址呢(虽然可以不指定,如第一种方法)?因为 HTML 文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名为baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也就是这个 baseURL。

例如 <a href=/project> 开源软件 </a> 会被转换成 <ahref=/project> 开源软件 </a>。

回页首解析并提取 HTML 元素这部分涉及一个 HTML 解析器最基本的功能,但 jsoup 使用一种有别于其他开源项目的方式——选择器,我们将在最后一部分详细介绍 jsoup 选择器,本节中你将看到 jsoup 是如何用最简单的代码实现。

不过 jsoup 也提供了传统的 DOM 方式的元素解析,看看下面的代码:清单 2.File input = new File("D:/test.html");Document doc = Jsoup.parse(input, "UTF-8", "/");Element content = doc.getElementById("content");Elements links = content.getElementsByTag("a");for (Element link : links) {String linkHref = link.attr("href");String linkText = link.text();}你可能会觉得 jsoup 的方法似曾相识,没错,像 getElementById 和getElementsByTag 方法跟 JavaScript 的方法名称是一样的,功能也完全一致。

你可以根据节点名称或者是 HTML 元素的 id 来获取对应的元素或者元素列表。

与 htmlparser 项目不同的是,jsoup 并没有为 HTML 元素定义一个对应的类,一般一个 HTML 元素的组成部分包括:节点名、属性和文本,jsoup 提供简单的方法供你自己检索这些数据,这也是 jsoup 保持瘦身的原因。

而在元素检索方面,jsoup 的选择器简直无所不能,清单 3.File input = new File("D:\test.html");Document doc = Jsoup.parse(input,"UTF-8","/");Elements links = doc.select("a[href]"); // 具有 href 属性的链接Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素Element masthead = doc.select("div.masthead").first();// 找出定义了 class=masthead 的元素Elements resultLinks = doc.select("h3.r > a"); // direct a after h3这是 jsoup 真正让我折服的地方,jsoup 使用跟 jQuery 一模一样的选择器对元素进行检索,以上的检索方法如果换成是其他的 HTML 解释器,至少都需要很多行代码,而 jsoup 只需要一行代码即可完成。

jsoup 的选择器还支持表达式功能,我们将在最后一节介绍这个超强的选择器。

回页首修改数据在解析文档的同时,我们可能会需要对文档中的某些元素进行修改,例如我们可以为文档中的所有图片增加可点击链接、修改链接地址或者是修改文本等。

下面是一些简单的例子:清单 4.doc.select("ments a").attr("rel", "nofollow");// 为所有链接增加 rel=nofollow 属性doc.select("ments a").addClass("mylinkclass");// 为所有链接增加 class=mylinkclass 属性doc.select("img").removeAttr("onclick"); // 删除所有图片的 onclick 属性doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本道理很简单,你只需要利用 jsoup 的选择器找出元素,然后就可以通过以上的方法来进行修改,除了无法修改标签名外(可以删除后再插入新的元素),包括元素的属性和文本都可以修改。

修改完直接调用 Element(s) 的 html() 方法就可以获取修改完的 HTML 文档。

回页首HTML 文档清理jsoup 在提供强大的 API 同时,人性化方面也做得非常好。

在做网站的时候,经常会提供用户评论的功能。

有些用户比较淘气,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,例如XSS 跨站点攻击之类的。

jsoup 对这方面的支持非常强大,使用非常简单。

看看下面这段代码:清单 5.String unsafe = "<p><a href='/'onclick='stealCookies()'>开源中国社区 </a></p>";String safe = Jsoup.clean(unsafe, Whitelist.basic());// 输出 :// <p><a href="/" rel="nofollow"> 开源中国社区</a></p>jsoup 使用一个 Whitelist 类用来对 HTML 文档进行过滤,该类提供几个常用方法:表 1. 常用方法:方法名简介none() 只允许包含文本信息basic() 允许的标签包括:a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul, 以及合适的属性simpleText() 只允许b, em, i, strong, u 这些标签basicWithImages() 在basic() 的基础上增加了图片relaxed() 这个过滤器允许的标签最多,包括:a, b, blockquote, br, caption, cite, code, col, colgroup, dd, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul如果这五个过滤器都无法满足你的要求呢,例如你允许用户插入 flash 动画,没关系,Whitelist 提供扩展功能,例如whitelist.addTags("embed","object","param","span","div"); 也可调用addAttributes 为某些元素增加属性。

相关文档
最新文档