当前位置: 首页 > ops >正文

网络爬虫——Jsoup解析HTML

目录

    • 1、Jsoup解析HTML
      • 1.1解析静态HTML文件
      • 1.2、解析URL加载的Document
      • 1.3、Jsoup遍历元素
      • 1.4、Jsoup获取元素的其它方法
    • 2、支持Xpath语法的JsoupXpath

1、Jsoup解析HTML

Jsoup 依赖于 CSS 选择器与 jQuery 方法来操作 HTML 文件中的数据。使用 Jsoup 之前,需要了解 Jsoup 中的 Node、Element 和 Document 的概念。

  • 节点(Node):HTML 文件中所包含的内容都可以看成一个节点。节点有很多种类 型,如属性(Attribute)节点、注释(Note)节点、文本(Text)节点和元素(Element) 节点等。解析 HTML 文件的过程,实际上就是对节点进行操作的过程。
  • 元素(Element):节点的子集,所以一个元素也是一个节点。
  • 文档(Document):整个 HTML 文档的源码内容。

1.1解析静态HTML文件

给定 HTML 字符串,可以使用 org.jsoup.Jsoup 类中的 parse(String html)方法,将 String 类型的 HTML 文件转化成 Document 类型。之后,可以使用 org.jsoup.nodes.Element 类 中的 select(String cssQuery)方法定位到所要解析的元素。

public class JsoupParseStaticFile {public static void main(String[] args) {//HTML静态文件String html = "<html><body><div id=\"w3school\"> <h1>浏览器 脚本教程</h1> <p><strong>从左侧的菜单选择你需要的教程!</strong></p> </div>"+ "<div> <div id=\"course\"> <ul> <li><a href=\"/ js/index.asp\" title=\"JavaScript 教 程 \">JavaScript</a></li> </ul> </div> </body></html>";//转化成DocumentDocument document = Jsoup.parse(html);//基于CSS选择器获取元素Element element = document.select("div[id=w3school]").get(0);System.out.println("元素内容为:\n" + element);}
}
元素内容为:
<div id="w3school"> <h1>浏览器 脚本教程</h1> <p><strong>从左侧的菜单选择你需要的教程!</strong></p> 
</div>

1.2、解析URL加载的Document

指定 URL,可先使用 Jsoup 请求 URL,获取对应的 Document。之后,再使用 select (String cssQuery)方法定位要解析的内容。

public class JsoupParseURLDoc {public static void main(String[] args) throws IOException {//获取URL对应的DocumentDocument doc = Jsoup.connect("https://m.runoob.com/java/").timeout(5000).get();//基于CSS选择器获取元素,这里换了一种方式Element element = doc.select("#content > div:nth-child(1) > a > h2").get(0);System.out.println("输出解析的元素内容为:");System.out.println(element);//从Element提取内容(抽取一条Node对应的信息)String text1 = element.text();System.out.println("文本信息:" + text1);String className = element.className();System.out.println("class:" + className);}
}
输出解析的元素内容为:
<h2 class="entry-title">Java 教程</h2>
文本信息:Java 教程
class:entry-title

1.3、Jsoup遍历元素

org.jsoup.nodes.Element 类中的 select(String cssQuery)方法返回的是 Elements 对象,即匹配得到 cssQuery 对应的所有元素集合。org.jsoup.select.Elements 类继承 了 ArrayList,所以,可以按照操作 ArrayList 集合的方式操作 Elements 对象,如获取某元素可使用 get(int index)方法。 同样,也可以按照遍历 ArrayList 集合的方式遍历 Elements 对象。

在这里插入图片描述

遍历获取菜鸟教程的课程URL,页面HTML如下:
在这里插入图片描述

public class JsoupParseEveryEle {public static void main(String[] args) throws IOException {//获取URL对应的DocumentDocument doc = Jsoup.connect("https://www.runoob.com").timeout(5000).get();//层层定位到要解析的内容,可以发现包含多个li元素Elements elements = doc.select("body > div.container.main > div > div.col.middle-column-home > div.codelist.codelist-desktop.cate1").select("a");//遍历每一个li节点for (Element ele : elements) {String title = ele.select("h4").text();String describe = ele.select("strong").text();String url = ele.attr("href");System.out.println("标题为:" + title);System.out.println("描述为:" + describe);System.out.println("URL为:" + url);System.out.println();}}
}
标题为:【学习 HTML】
描述为:HTML,即超文本标记语言(Hyper Text Markup LanguageURL为://www.runoob.com/html/html-tutorial.html标题为:【学习 HTML5】
描述为:HTML5 是下一代 HTML 标准
URL为://www.runoob.com/html/html5-intro.html标题为:【学习 CSS】
描述为:层叠样式表(Cascading StyleSheetURL为://www.runoob.com/css/css-tutorial.html标题为:【学习 CSS3】
描述为:CSS3CSS技术的升级版本
URL为://www.runoob.com/css3/css3-tutorial.html标题为:【学习 Bootstrap3】
描述为:Bootstrap,来自 Twitter,是目前最受欢迎的前端框架
URL为://www.runoob.com/bootstrap/bootstrap-tutorial.html标题为:【学习 Bootstrap4】
描述为:Bootstrap4 前端框架
URL为://www.runoob.com/bootstrap4/bootstrap4-tutorial.html标题为:【学习 Bootstrap5】
描述为:Bootstrap5 目前是 Bootstrap 的最新版本
URL为://www.runoob.com/bootstrap5/bootstrap5-tutorial.html标题为:【学习 Font Awesome】
描述为:Font Awesome 是一套绝佳的图标字体库和CSS框架。
URL为://www.runoob.com/font-awesome/fontawesome-tutorial.html标题为:【学习 Foundation】
描述为:Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架
URL为://www.runoob.com/foundation/foundation-tutorial.html

1.4、Jsoup获取元素的其它方法

方法描述
Element getElementById(String id)基于 id 获取元素
Elements getElementsByTag(String tagName)基于标签名称获取元素集合
Elements getElementsByAttribute(String key)基于属性名称获取元素集合
Elements getElementsByClass(String className)基于类名获取元素集合
Elements getElementsByAttributeStarting(StringkeyPrefix)通过属性前缀获取元素集合
Elements getElementsByAttributeValue(String key,String value)基于属性和属性值获取元素集合
Elements getElementsByAttributeValueStarting(String key, String valuePrefix)基于属性和属性值前缀获取元素集合
Elements getElementsByAttributeValueEnding(String key, String valueSuffix)基于属性和属性值后缀获取元素集合
Elements getElementsByAttributeValueContaining(String key, String match)基于属性与属性值(包含某字符串)获取元素集合
Elements getElementsByAttributeValueMatching(String key, String regex)基于属性与属性值(正则表达式)获取元素集合
Elements siblingElements()获取兄弟元素集合,如果没有返回空列表
Element nextElementSibling()获取下一个兄弟元素,如果没有返回 null
Element previousElementSibling()获取上一个兄弟元素,如果没有返回 null
Element firstElementSibling()获取第一个兄弟元素
Element lastElementSibling()获取最后一个兄弟元素
Elements children()获取子元素集合

2、支持Xpath语法的JsoupXpath

Jsoup 在选择节点或元素时,支持的是 CSS 选择器,而不支持 Xpath 语法。而 JsoupXpath 则是在 Jsoup 的基础上扩展的支持 Xpath 语法的 HTML 文件解析器。
使用 JsoupXpath 解析 HTML 文件之前,需要在 Maven 工程的 pom.xml 文件中添 加 JsoupXpath 对应的 dependency。

<dependency> <groupId>cn.wanghaomiao</groupId><artifactId>JsoupXpath</artifactId><version>2.2</version> 
</dependency>

在 JsoupXpath 解析 HTML 时,可以先通过 JXDocument 类中提供的 4 种方法实例化 JXDocument 对象,如程序所示。这四种方法传递的参数分别是 Document 类型 的 HTML 文档、Elements 类型的元素集合、String 类型的 HTML 字符串和 String 类型 的 URL。

public static JXDocument create(Document doc){ Elements els = doc.children();return new JXDocument(els);
}public static JXDocument create(Elements els){return new JXDocument(els); 
}public static JXDocument create(String html){ Elements els = Jsoup.parse(html).children(); return new JXDocument(els);
}public static JXDocument createByUrl(String url){Elements els; try {els = Jsoup.connect(url).get().children(); } catch (Exception e) {throw new XpathParserException("url ",e); }return new JXDocument(els); 
}

示例,依旧解析课程URL

public class JsoupXpathDemo {public static void main(String[] args) {//基于URL创建JXDocument jxd = JXDocument.createByUrl("https://www.runoob.com");//Xpath语句String xpathStr = "//div[1]/a";//获取节点集合List<JXNode> list = jxd.selN(xpathStr);//遍历节点for (JXNode node : list) {String title = node.sel("./h4").get(0).asElement().text();String describe = node.sel("./strong").get(0).asElement().text();String url = node.asElement().attr("href");System.out.println("标题为:" + title);System.out.println("描述为:" + describe);System.out.println("URL为:" + url);System.out.println();}}
}
标题为:【学习 HTML】
描述为:HTML,即超文本标记语言(Hyper Text Markup LanguageURL为://www.runoob.com/html/html-tutorial.html标题为:【学习 HTML5】
描述为:HTML5 是下一代 HTML 标准
URL为://www.runoob.com/html/html5-intro.html标题为:【学习 CSS】
描述为:层叠样式表(Cascading StyleSheetURL为://www.runoob.com/css/css-tutorial.html标题为:【学习 CSS3】
描述为:CSS3CSS技术的升级版本
URL为://www.runoob.com/css3/css3-tutorial.html标题为:【学习 Bootstrap3】
描述为:Bootstrap,来自 Twitter,是目前最受欢迎的前端框架
URL为://www.runoob.com/bootstrap/bootstrap-tutorial.html标题为:【学习 Bootstrap4】
描述为:Bootstrap4 前端框架
URL为://www.runoob.com/bootstrap4/bootstrap4-tutorial.html标题为:【学习 Bootstrap5】
描述为:Bootstrap5 目前是 Bootstrap 的最新版本
URL为://www.runoob.com/bootstrap5/bootstrap5-tutorial.html标题为:【学习 Font Awesome】
描述为:Font Awesome 是一套绝佳的图标字体库和CSS框架。
URL为://www.runoob.com/font-awesome/fontawesome-tutorial.html标题为:【学习 Foundation】
描述为:Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架
URL为://www.runoob.com/foundation/foundation-tutorial.html
http://www.xdnf.cn/news/11721.html

相关文章:

  • 手把手教你安装VMware Workstation虚拟机
  • CSS3——transition过渡效果
  • endnote国内杂志文献格式_【科研工具42】Endnote 软件使用教程
  • 网络爬虫是什么
  • SD卡分区及取消分区
  • MicroPython之TPYBoard v102开发板控制OLED显示中文
  • 对象名'***'无效?
  • VS2008操作技巧(不断更新)
  • crc循环校验原理和实现
  • android2.2刷机,中兴 V880 Android 2.2.2 ROM 刷机包 省电 流畅
  • 《刺客信条:启示录》低配置画面设置优化
  • 网吧无盘服务器进u盘启动,利用U盘启动在网吧免费上网
  • Altium_Protel99SE的使用
  • 【手把手教你Ubuntu】Ubuntu 13.04 Server版本安装图解教程
  • springboot基于微信小程序的钓鱼交友平台设计与实现-计算机毕业设计源码33506
  • 文章出轨被爆是愚人节整蛊 网民你知道吗?
  • 黑莓7100刷机及修改PIN,完美破解超越输入法
  • 新浪微博开放平台开发步骤简介(适合新手看)
  • MFC--界面库
  • 电商网站建设中的网站内容管理策略
  • 机器人抓取(三)—— Azure Kinect SDK 及 ROS 驱动安装
  • JAVA下载的详细教程
  • 分享70个ASP江湖论坛源码,总有一款适合您
  • ASP六大对象介绍
  • 微信5.0 Android版飞机大战破解无敌模式手记
  • 个人空间岁末大回报活动12月26日获奖名单
  • JS监听组合按键
  • 星空极速 加密算法(附本人C语言源代码)
  • 有关ARP
  • Filezilla使用