网络爬虫——Jsoup解析HTML

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>";
        //转化成Document
        Document 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对应的Document
        Document 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对应的Document
        Document 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
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值