有一个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
属性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开始) |
操做 | 含义 |
---|---|
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() | 获取元素标签名 |
操做 | 含义 |
---|---|
append(String html) | 添加给定的html到元素末尾 |
prepend(String html) | 添加给定html到元素前面 |
appendText(String text) | 建立并添加文本 |
prependText(String text) | 建立并添加文本 |
appendElement(String tagName) | 添加到元素末尾 |
prependElement(String tagName) | 添加到元素前 |
html(String value) | 设置元素值 |
使用 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在Document, Element,或Elements 对象中均可以使用。且是上下文相关的,所以可实现指定元素的过滤,或者链式选择访问。Select方法将返回一个Elements 集合,并提供一组方法来抽取和处理结果jquery
操做 | 含义 |
---|---|
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)] |
* | 定位全部元素 |
操做 | 含义 |
---|---|
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 |
操做 | 含义 |
---|---|
: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) | 使用正则表达式找到自身的文本 |
操做 | 含义 |
---|---|
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内容
有一个包含相对URLs路径的HTML文档,须要将这些相对路径转换成绝对路径的URLs。正则表达式
baseURI
,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