Jsoup 数据抽取
Jsoup 数据抽取
羽落星辰 发表于9个月前
Jsoup 数据抽取
  • 发表于 9个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

数据抽取

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

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


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的方法来查找元素,抽取并处理其中的数据。

1.1查找元素

属性

操作 含义
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的语法来查找和操作元素。

    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 集合,并提供一组方法来抽取和处理结果

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内容

使用

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源码中指定的值。

假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href"),因此,在解析HTML文档时,定义baseURI非常重要。

如果你不想使用abs: 前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 57
码字总数 35204
×
羽落星辰
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: