Jsoup 数据抽取

数据抽取

1 使用DOM方法来遍历一个文档

有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。将HTML解析成一个Document以后,就可使用相似于DOM的方法进行操做。css

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

说明 :Elements这个对象提供了一系列相似于DOM的方法来查找元素,抽取并处理其中的数据。html

1.1查找元素

属性java

操做 含义
getElementById(String id) id
getElementsByTag(String tag) 标签名
getElementsByClass(String className) class名
getElementsByAttribute(String key)
siblingElements() 全部的兄弟元素
firstElementSibling() 第一个兄弟元素
lastElementSibling() 最后一个兄弟元素
nextElementSibling() 下一个兄弟元素
previousElementSibling() 上一个兄弟元素
parent() 获取该元素父节点
children() 获取该元素的子元素
child(int index) 获取该元素的第几个子元素(下标从0开始)

1.2 元素数据

操做 含义
attr(String key) 获取属性
attr(String key, String value) 设置属性
attributes() 获取全部属性
id() 获取该元素id
className() 获取该元素class,多个class之间空格隔开
classNames() 获取全部元素的class
text() 获取文本内容
text(String value) 设置文本内容
html() 获取元素内HTML
html(String value) 设置元素内的HTML内容
outerHtml() 获取元素外HTML内容
data() 获取数据内容(例如:script和style标签)
tag()  
tagName() 获取元素标签名

1.3 操做HTML和文本

操做 含义
append(String html) 添加给定的html到元素末尾
prepend(String html) 添加给定html到元素前面
appendText(String text) 建立并添加文本
prependText(String text) 建立并添加文本
appendElement(String tagName) 添加到元素末尾
prependElement(String tagName) 添加到元素前
html(String value) 设置元素值

2 使用选择器语法来查找元素(select)

使用 Element.select(String selector) 和 Elements.select(String selector),使用相似于CSS或jQuery的语法来查找和操做元素。node

File input = new File("/tmp/input.html");
    Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
    Elements links = doc.select("a[href]"); //带有href属性的a元素
    Elements pngs = doc.select("img[src$=.png]"); //扩展名为.png的图片
    Element masthead = doc.select("div.masthead").first();//class等于masthead的div标签
    Elements resultLinks = doc.select("h3.r > a"); //在h3元素以后的a元素

说明: 
jsoup elements对象支持相似于CSS (或jquery)的选择器语法,来实现很是强大和灵活的查找功能。Select在DocumentElement,或Elements 对象中均可以使用。且是上下文相关的,所以可实现指定元素的过滤,或者链式选择访问。Select方法将返回一个Elements 集合,并提供一组方法来抽取和处理结果jquery

2.1 Select 选择器 简单用法

操做 含义
tagname 使用标签名来定位,例如 a
ns|tag 使用命名空间的标签订位,例如 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] 利用匹配属性值开头、结尾或包含属性值来查找元素,好比:[href*=/path/]
[attr~=regex] 利用属性值匹配正则表达式来查找元素,例如img[src~=(?i).(png|jpe?g)]
* 定位全部元素

2.2 Selector选择器 组合使用

操做 含义
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
ancestor child 查找某个元素下子元素,好比:能够用.body p 查找在"body"元素下的全部 p元素
parent > child 查找某个父元素下的直接子元素,好比:能够用div.content > p 查找 p 元素,也能够用body > * 查找body标签下全部直接子元素
siblingA + siblingB 查找在A元素以前第一个同级元素B,好比:div.head + div
siblingA ~ siblingX 查找A元素以前的同级X元素,好比:h1 ~ p
el, el, el 多个选择器组合,查找匹配任一选择器的惟一元素,例如:div.masthead, div.logo

2.3 伪选择器selectors (表达式)

操做 含义
:lt(n) 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,好比:td:lt(3) 表示小于三列的元素
:gt(n) 查找哪些元素的同级索引值大于n``,好比: div p:gt(2)表示哪些div中有包含2个以上的p元素
:eq(n) 查找哪些元素的同级索引值与n相等,好比:form input:eq(1)表示包含一个input标签的Form元素
:has(seletor) 查找匹配选择器包含元素的元素,好比:div:has(p)表示哪些div包含了p元素
:not(selector) 查找与选择器不匹配的元素,好比: div:not(.logo) 表示不包含 class=logo 元素的全部 div 列表
:contains(text) 查找包含给定文本的元素,不区分大不写,好比: p:contains(jsoup)
:containsOwn(text) 查找文本信息彻底等于指定条件的元素
:matches(regex) 使用正则表达式进行文本过滤:div:matches((?i)login)
:matchesOwn(regex) 使用正则表达式找到自身的文本

3 从元素抽取属性,文本和HTML

操做 含义
Node.attr(String key)  获取属性值
Element.text()  获取元素中的文本值
Element.html()  获取元素HTML内容
Node.outerHtml()  获取元素HTML内容

使用css3

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
Element link = doc.select("a").first();//查找第一个a元素

String text = doc.body().text(); // "An example link"//取得字符串中的文本
String linkHref = link.attr("href"); // "http://example.com/"//取得连接地址
String linkText = link.text(); // "example""//取得连接地址中的文本

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"//取得连接内的html内容

4.处理URLs

   有一个包含相对URLs路径的HTML文档,须要将这些相对路径转换成绝对路径的URLs。正则表达式

  1. 在解析文档时确保有指定baseURI
  2. 而后使用abs属性性前缀来取得包含baseURI的绝对路径
Document doc = Jsoup.connect("http://www.open-open.com").get();

Element link = doc.select("a").first();
String relHref = link.attr("href"); // == "/"
String absHref = link.attr("abs:href"); // "http://www.open-open.com/"

说明: 
在HTML元素中,URLs常常写成相对于文档位置的相对路径: <a href="/download">...</a>. 当你使用 Node.attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定的值。api

假如你须要取得一个绝对路径,须要在属性名前加 abs: 前缀。这样就能够返回包含根路径的URL地址attr("abs:href"),所以,在解析HTML文档时,定义baseURI很是重要。app

若是你不想使用abs: 前缀,还有一个方法可以实现一样的功能 Node.absUrl(String key)spa

相关文章
相关标签/搜索