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

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

这篇文章主要介绍了Jsoup如何解析一个HTML文档、从文件加载文档、从URL加载Document等方法,对Jsoup常用方法做了详细讲解,最近提供了一个示例供大家参考 使用DOM方法来遍历一个文档 从元素抽取属性,文本和HTML 获取所有链接

解析和遍历一个HTML文档

如何解析一个HTML文档

String html = "<html><head><title>First parse</title></head>"+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

其解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:

1、没有关闭的标签 (比如: <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>)
2、隐式标签 (比如. 它可以自动将 <td>Table data</td>包装成<table><tr><td>?)
3、创建可靠的文档结构(html标签包含head 和 body,在head只出现恰当的元素)

一个文档的对象模型

1、文档由多个Elements和TextNodes组成 (以及其它辅助nodes).
2、其继承结构如下:Document继承Element继承Node. TextNode继承 Node.
3、一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。

从一个URL加载一个Document

存在问题
你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据。你可以使用下面解决方法:

解决方法

使用 Jsoup.connect(String url)方法:

Document doc = Jsoup.connect("//www.jb51.net/").get();
String title = doc.title();

说明
connect(String url) 方法创建一个新的 Connection, 和 get() 取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。

Connection 接口还提供一个方法链来解决特殊请求,具体如下:

Document doc = Jsoup.connect("//www.jb51.net").data("query", "Java").userAgent("Mozilla").cookie("auth", "token").timeout(3000).post();

这个方法只支持Web URLs (http和https 协议); 假如你需要从一个文件加载,可以使用parse(File in, String charsetName) 代替。

从一个文件加载一个文档

问题
在本机硬盘上有一个HTML文件,需要对它进行解析从中抽取数据或进行修改。

办法

可以使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "//www.jb51.net/");

说明
parse(File in, String charsetName, String baseUri) 这个方法用来加载和解析一个HTML文件。如在加载文件的时候发生错误,将抛出IOException,应作适当处理。
baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。
另外还有一个方法parse(File in, String charsetName) ,它使用文件的路径做为 baseUri。 这个方法适用于如果被解析文件位于网站的本地文件系统,且相关链接也指向该文件系统。


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

问题
你有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。

方法

将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。示例代码:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "//www.jb51.net/");
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的方法来查找元素,抽取并处理其中的数据。具体如下:
查找元素
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)
Element siblings: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
Graph: parent(), children(), child(int index)

元素数据
attr(String key)获取属性attr(String key, String value)设置属性
attributes()获取所有属性
id(), className() and classNames()
text()获取文本内容text(String value) 设置文本内容
html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
outerHtml()获取元素外HTML内容
data()获取数据内容(例如:script和style标签)
tag() and tagName()

操作HTML和文本
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)


使用选择器语法来查找元素
问题
你想使用类似于CSS或jQuery的语法来查找和操作元素。

方法

可以使用Element.select(String selector) 和 Elements.select(String selector) 方法实现:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "//www.jb51.net./");
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集合,并提供一组方法来抽取和处理结果。

Selector选择器概述
tagname: 通过标签查找元素,比如:a
ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 <fb:name> 元素
#id: 通过ID查找元素,比如:#logo
.class: 通过class名称查找元素,比如:.masthead
[attribute]: 利用属性查找元素,比如:[href]
[^attr]: 利用属性名前缀来查找元素,比如:可以用[^data-] 来查找带有HTML5 Dataset属性的元素
[attr=value]: 利用属性值来查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
*: 这个符号将匹配所有元素

Selector选择器组合使用
el#id: 元素+ID,比如: div#logo
el.class: 元素+class,比如: div.masthead
el[attr]: 元素+class,比如: a[href]
任意组合,比如:a[href].highlight
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

伪选择器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): 查找自身包含文本匹配指定正则表达式的元素
注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等
可以查看Selector API参考来了解更详细的内容


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

问题
在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。

方法
要取得一个属性的值,可以使用Node.attr(String key) 方法
对于一个元素中的文本,可以使用Element.text()方法
对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法

示例:

String html = "<p>An <a href='//www.jb51.net/'><b>www.jb51.net</b></a> link.</p>";
Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
Element link = doc.select("a").first();//查找第一个a元素
String text = doc.body().text(); // "An www.jb51.net link"//取得字符串中的文本
String linkHref = link.attr("href"); // "//www.jb51.net/"//取得链接地址
String linkText = link.text(); // "www.jb51.net""//取得链接地址中的文本String linkOuterH = link.outerHtml(); // "<a href="//www.jb51.net"><b>www.jb51.net</b></a>"
String linkInnerH = link.html(); // "<b>www.jb51.net</b>"//取得链接内的html内容

说明
上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:

Element.id()
Element.tagName()
Element.className() and Element.hasClass(String className)
这些访问器方法都有相应的setter方法来更改数据.


示例程序: 获取所有链接
这个示例程序将展示如何从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。

运行下面程序需要指定一个URLs作为参数

package org.jsoup.www.jb51.nets;
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.IOException;/*** www.jb51.net program to list links from a URL.*/
public class ListLinks {public static void main(String[] args) throws IOException {Validate.isTrue(args.length == 1, "usage: supply url to fetch");String url = args[0];print("Fetching %s...", url);Document doc = Jsoup.connect(url).get();Elements links = doc.select("a[href]");Elements media = doc.select("[src]");Elements imports = doc.select("link[href]");print("\nMedia: (%d)", media.size());for (Element src : media) {if (src.tagName().equals("img"))print(" * %s: <%s> %sx%s (%s)",src.tagName(), src.attr("abs:src"), src.attr("width"), src.attr("height"),trim(src.attr("alt"), 20));elseprint(" * %s: <%s>", src.tagName(), src.attr("abs:src"));}print("\nImports: (%d)", imports.size());for (Element link : imports) {print(" * %s <%s> (%s)", link.tagName(),link.attr("abs:href"), link.attr("rel"));}print("\nLinks: (%d)", links.size());for (Element link : links) {print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));}}private static void print(String msg, Object... args) {System.out.println(String.format(msg, args));}private static String trim(String s, int width) {if (s.length() > width)return s.substring(0, width-1) + ".";elsereturn s;}
}
org/jsoup/www.jb51.nets/ListLinks.java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构师考试9

系统架构师复习经验及资料共享 [复制链接] 发表于 2018-2-5 11:25 | 来自 51CTO网页 [只看他] 楼主 在入职第一天。。 人力&#xff1a;有没有证书 我&#xff1a;。。没有&#xff0c;目前都有哪些证书 人力回了一张图&#xff0c;上面大概有PMP、项目管理师、系统架构师…

java通过commons-fileupload实现多张图片的上传(servlet)

//添加食品信息private void addProduct(HttpServletRequest request, HttpServletResponse response) throws IOException{PrintWriter out response.getWriter();/*Date datenew Date();SimpleDateFormat formatnew SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Stri…

javaweb项目搭建ehcache缓存系统

转载自 javaweb项目搭建ehcache缓存系统EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认的CacheProvider&#xff0c;同时在项目开发中也被广泛使用到。接下来就以用户缓存为例&#xff0c;基于javaweb项目来搭建ehcache…

微服务架构之外的选择——基于服务架构

来自ThoughtWorks的主管Neal Ford在最近的一次演讲中表达了他对企业软件系统架构转型的看法&#xff0c;他认为从单体架构转向基于服务的架构要比转向微服务架构来得容易。Ford在UberConf 2016大会上做了一次关于基于服务架构的演讲&#xff0c;基于服务架构是介于面向服务架构…

html5中 save方法,如何HTML5画布另存为窗口8 Metro应用中的图像文件?(How to save html5 c...

var myImage canvas.toDataURL("image/png");我认为myImage在现在png格式如何保存编码的图像字节myImage作为一个文件(图片文件夹)&#xff1f;Answer 1:而不是使用的.toDataUrl &#xff0c;你需要使用.msToBlob &#xff1a;var blob canvas.msToBlob();然后&…

系统架构师8

软考——系统架构设计师工作日志 《E:\Myproject\利亚德\x系统架构设计师\系统架构设计师工作日志.txt》 系统架构设计师 ok --》主要信息 官方&#xff1a; 人事考试服务频道.mht http://www.bjld.gov.cn/bjpta/ 北京人事考试 http://www.bjld.g…

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

Autofac 结合 Castle DynamicProxy2 功能 Autofac 不仅作为轻量级高效的 IoC 容器&#xff0c;而且还能很好的与 Castle.DynamicProxy2 结合起来&#xff0c;实现 AOP 功能。 首先&#xff0c;我们需要定义拦截器&#xff0c;简单的定义可实现 Castle.DynamicProxy.IIntercepto…

类和对象运行时在内存里是怎么样的?各种变量、方法在运行时是怎么交互的?

转载自 类和对象运行时在内存里是怎么样的&#xff1f;各种变量、方法在运行时是怎么交互的&#xff1f;在回答这个问题之前先了解一下Java的一些基础知识。我们知道Java程序运行在虚拟机环境里&#xff0c;那我们先看一下虚拟机的大致内存结构。如下图所示&#xff0c;虚线框…

java通过commons-fileupload实现多张图片的上传(jsp页面)

<div id"middle"><div id"form"><form action"ProductInfoServlet?tagadd" method"post" enctype"multipart/form-data" ><h2>三只松鼠--新增</h2><table align"center">&l…

系统架构师7

2017年11月11日 软件系统架构师考试经验分享 置顶 2017年11月13日 15:25:53 凌飞安 阅读数 7812 版权声明&#xff1a;原创作品&#xff0c;转载请注明出处&#xff01;个人主页 http://www.lingfeian.com https://blog.csdn.net/lingfeian/article/details/78520808 系统架构…

工业利用计算机实现生产自动化属于,自动化考试试题(含答案)

第一类&#xff1a;填空题一&#xff0e;填空题1&#xff0e;自动化控制系统按被控量的时间特性分为(连续量)和(离散量)。2&#xff0e;PLC 全称为(可编程序逻辑控制器)&#xff0c;DCS全称为( 集散控制系统)。3&#xff0e;输入输出单元是(PLC)与工业过程控制现场之间的连接部…

保定有国家承认的计算机学校吗,河北省122所大学名单,不在名单内的都是国家不承认的野鸡学校...

原标题&#xff1a;河北省122所大学名单&#xff0c;不在名单内的都是国家不承认的野鸡学校据教育部官网信息显示&#xff0c;截至2019年6月15日&#xff0c;河北省共有普通高等学校122所&#xff0c;其中本科院校61所&#xff0c;专科院校61所。在名单中虽然有一所211院校&…

从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

转载自 从Java类到对象的创建过程都做了些啥&#xff1f;内存中的对象是啥样的&#xff1f;先回顾一下Java程序执行的过程&#xff1a;Java程序执行时&#xff0c;第一步系统创建虚拟机进程&#xff0c;然后虚拟器用类加载器Class Loader加载java程序类文件到方法区。方法区放…

ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件

ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core。 曾经在WebForms上写过 HighchartsNET快速图表控件-开源 Highcharts的ASP.NET Web自定义控件。 今天我就来改造它&#xff0c;将其使用最新的TagHelper 来实践&#xff0c;学习TagHelper 的使用…

架构师6

系统架构师考试总结 2019年06月11日 10:48:47 devillyd2018 阅读数 103 2011年11月12日&#xff0c;在这个百年一遇的大单身节的第二天&#xff0c;我怀着无比紧张的心情走进了系统架构师的考场。 虽然暂时还不知道我的成绩&#xff0c;无所谓啦&#xff0c;虽然答的一般&…

计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc

成 绩评卷人姓 名嘉炬学 号华 中 师 范 大 学研 究 生 课 程 论 文论文题目 计算机视觉技术在教育领域的应用完成时间 2015年1月15日课程名称 计算机视觉专 业 通信与信息系统年 级 2014级注&#xff1a;研究生须在规定期限内完成课程论文&#xff0c;并用A4页面打印&#xff0…

Oracle数据库基本概念理解(1)

--函数 数字转换为字符 --0 强制位数&#xff0c;9位数不够不显示 $美元 SELECT TO_CHAR(124.3456,0000.00) FROM dual ; SELECT TO_CHAR(124.3456,9999.99) FROM dual ; SELECT TO_CHAR(124.3456,$9999.99) FROM dual ; --日期 日期转换为字符 SELECT TO_CHAR(SYSDATE,YY…

关于Heap Dump

转载自 关于Heap DumpHeap Dump是什么&#xff1f; Heap Dump也叫堆转储文件&#xff0c;是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC&a…

使用StyleCop 进行代码评审

使用StyleCop对原代码进行审查&#xff0c;看编写的代码是否遵循设计规范、.Net约定和一些贯用法等。保证代码的一致性&#xff0c;可读性等等。 在此之前&#xff0c;先简单介绍下FxCop&#xff08;起初只是微软内部使用的工具&#xff09;,一个分析托管程序集&#xff0c;检测…

系统架构师5 ***********那就给个合格分了。111

https://download.csdn.net/download/sun_lq/11109495 https://download.csdn.net/download/u011669055/10736374 https://download.csdn.net/download/robertsoft/10747039 十年IT从业背景&#xff0c;一次考试通过系统分析师(通过系统分析师的学习 ... [复制链接] 发表于 …