浅谈jsoup网页抓取技术
最近初步接触HTML的页面抓取技术,之前曾涉及较多的是XML解析,对于XML解析方法非常的多,使用dom4j是最方便的。HTML解析似乎用途会更多一些,对于HTML的页面解析却也不甚了解。查了一些资料,了解到了jsoup页面解析技术,jsoup是一款java的HTML解析器,可以直接解析某个URL地址、HTML文本内容,它提供了一套非常省力的API,可通过DOM,CSS以及类似于jquery的操作方法来取出和操作数据。主要内容可以参考下面两个站点:
jsoup的中文简明手册如下: http://www.open-open.com/jsoup
jsoup api: http://jsoup.org/apidocs/
jsoup的主要类如下图所示。
使用前需要将jsoup的jar包build path到项目中。jsoup可以从包括字符串、URL地址、以及本地文件来加载HTML文档,并生成Document对象实例。三种解析方式如下:
(1)解析HTML格式的字符串
Document doc = Jsoup.parse("html格式的字符串");
(2)解析URL指向的页面
Document doc = Jsoup.connect(url).get();
(3)解析本地HTML文档
File input = new File("D:/test.html");
Document doc = Jsoup.parse(input,"UTF-8","http://www.csdn.net/");
下面通过一个简单的示例程序看一看jsoup的基本使用方法:
程序的目的是解析并得到东大研究生院网站的最新动态部分的文本内容。
String url = "http://seugs.seu.edu.cn/"; Document doc = Jsoup.connect(url).get(); //得到页面标题 String title = doc.title(); System.out.println(title); //得到id为mainright的div标签元素 Elements top = doc.select("#mainright"); //得到其中的所有a标签元素 Elements topNews = top.select("a"); //输出得到的元素的text文本内容 for (Element e : topNews) { System.out.println(e.text()); }
可以得到输出内容为:
东南大学研究生院
我校组织研究生参加江苏科学道德与...
第十届全国研究生数模竞赛开始时间...
第十届全国研究生数学建模竞赛报名...
2013年秋学期研究生英语助教培训日...
关于征集第十一届全国博士生学术年...
可以看到代码非常的简单,并且能够很快的达到目的。jsoup的高效得益于其使用的标签选择器,这种方式有别于一般的网页抽取的开源项目。jsoup选择器的简单用法如下,具体可参见jsoup api。
选择器的基本用法:
tagname //使用标签名来定位,例如 a
ns:tg //使用命名空间的标签来定位, 例如 fb:name 来查找 <fb:name>元素
#id //使用元素id定位,例如 #logo
.class //使用元素的class属性定位,例如 .head
[attribute] //使用元素的的属性进行定位,例如[href]表示检索具有href属性的所有元素
[^attr]
//使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5 的 dataset 属性
[attr=value]
//使用属性值进行定位,例如 [width=500] 定位所有 width 属性值为 500 的元素
[attr^=value], [attr$=value], [attr*=value]
//这三个语法分别代表,属性以 value 开头、结尾以及包含
[attr~=regex]
// 使用正则表达式进行属性值的过滤,例如 img[src~=(?i)\.(png|jpe?g)]
* // 定位所有元素
组合用法:
el#id //定位 id 值某个元素,例如 a#logo -> <a id=logo href= … >
el.class
//定位 class 为指定值的元素,例如 div.head -> <div class=head>xxxx</div>
el[attr]
//定位所有定义了某属性的元素,例如 a[href]
//以上三个任意组合
例如 a[href]#logo 、a[name].outerlink
用一下方法可以获得元素(Element对象)的数据:
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
其次,还可以对数据进行修改,主要方法如下:
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)
html() //可以获取修改完的HTML文档
最后,谈一些用途,jsoup可以用在很多地方,例如整个不同的新闻源,Android开发中网页数据的抓取。使用jsoup都是一个非常不错的选择。