从零开发短视频电商 使用Jsoup进行HTML爬取解析与操作

文章目录

    • 简介
    • 原理
    • 依赖
    • 基础示例
    • 功能
      • 解析和遍历文档
      • 输入
        • 从字符串中解析文档
        • 从 URL 加载文档
        • 从文件加载文档
      • 数据提取
        • 使用 DOM 方法导航文档
        • 使用 CSS 选择器查找元素
        • 使用 XPath 选择器查找元素和节点
        • 从元素中提取属性、文本和 HTML
      • 清理HTML

官网: https://jsoup.org/

文档:https://jsoup.org/cookbook/

简介

jsoup 是一个 Java 库,可简化实际 HTML 和 XML 的使用。它提供了一个易于使用的 API,用于使用 DOM API 方法、CSS 和 xpath 选择器进行 URL 获取、数据解析、提取和操作。

jsoup 实现了 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。

  • 抓取
    从 URL、文件或字符串中抓取并解析 HTML

  • 查找
    使用 DOM 遍历或 CSS 选择器查找并提取数据

  • 操作
    操作 HTML 元素、属性和文本

  • 清理
    根据安全列表清理用户提交的内容,以防止 XSS 攻击

  • 输出

    输出整洁的 HTML

jsoup 旨在处理各种常见的 HTML;从原始和验证,到无效的标签; jsoup 将创建一个合理的解析树。

原理

jsoup 使用类似于jQuery的API,它将HTML文档解析成一个DOM树,然后可以使用类似于CSS选择器的语法来定位和操作文档中的元素。这种模型使得开发者能够以一种直观的方式进行数据提取和DOM操作。

依赖

<dependency><!-- jsoup HTML parser library @ https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.1</version>
</dependency>

基础示例

获取维基百科主页,将其解析为 DOM,然后从新闻部分中选择标题到元素列表中:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.IOException;/*** A simple example, used on the jsoup website.*/
public class Wikipedia {public static void main(String[] args) throws IOException {Document doc = Jsoup.connect("http://en.wikipedia.org/").get();log(doc.title());Elements newsHeadlines = doc.select("#mp-itn b a");for (Element headline : newsHeadlines) {log("%s\n\t%s", headline.attr("title"), headline.absUrl("href"));}}private static void log(String msg, String... vals) {System.out.println(String.format(msg, vals));}
}

XPath更强大,而CSS选择器通常语法比较简洁,运行速度更快些。

Chrome 插件:

  • Ranorex

  • selectorgadget

功能

解析和遍历文档

解析 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 格式是否良好:

  • 未封闭的标签(例如 <p>Lorem <p>Ipsum 解析为 <p>Lorem</p> <p>Ipsum</p>
  • 隐式标签(例如,裸露的 <td>Table data</td> 被包装到 <table><tr><td>... 中)
  • 可靠地创建文档结构( html 包含 headbody ,并且仅在头部中包含适当的元素)

Document的对象模型

  • 文档由 Elements 和 TextNodes(以及其他几个杂项节点)组成。
  • 继承链是: Document extends Element extends NodeTextNode 扩展 LeafNode 扩展 Node
  • 一个元素包含一系列子节点,并且有一个父元素。他们还提供了仅子元素的过滤列表。

输入

从字符串中解析文档
// 从字符串中解析文档
String html = "<html><head><title>First parse</title></head>"+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
// 解析片段
String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
从 URL 加载文档
Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();Document doc = Jsoup.connect("http://example.com").data("query", "Java").userAgent("Mozilla").cookie("auth", "token").timeout(3000).post();
从文件加载文档
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

数据提取

使用 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();
}

寻找元素

  • getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key)
  • 兄弟元素: siblingElements() 、 firstElementSibling() 、 lastElementSibling() ; nextElementSibling() ,previousElementSibling()
  • Graph: parent(), children(), child(int index)

元素数据

  • attr(String key) 用于获取属性
  • attributes() 获取所有属性
  • id() 、 className() 和 classNames()
  • text() 获取文本内容, text(String value) 设置文本内容
  • html() 获取内部 HTML 内容, html(String value) 设置内部 HTML 内容
  • outerHtml() 获取外部 HTML 值
  • data() 获取数据内容(例如 script 和 style 标签)
  • tag() and tagName() tag() 和 tagName()
使用 CSS 选择器查找元素
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "https://example.com/");Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");// img with src ending .pngElement masthead = doc.select("div.masthead").first();// div with class=mastheadElements resultDivs = doc.select("h3.r > div");// direct div after h3
Elements resultAs   = resultDivs.select("a");// A elements within resultDivs

选择器概述

tagname :通过标签查找元素,例如 div
#id :通过 ID 查找元素,例如 #logo
.class :按类名查找元素,例如 .masthead
[attribute] :具有属性的元素,例如 [href]
[^attrPrefix] :带有属性名称前缀的元素,例如 [^data-] 查找具有 HTML5 数据集属性的元素
[attr=value] :具有属性值的元素,例如 [width=500] (也可引用,如 [data-name='launch sequence']
[attr^=value][attr$=value][attr*=value] :具有以值开头、结尾或包含值的属性的元素,例如 [href*=/path/]
[attr~=regex] :属性值与正则表达式匹配的元素;例如 img[src~=(?i)\.(png|jpe?g)]
* :所有元素,例如 *
ns|tag :通过命名空间前缀中的标签查找元素,例如 fb|name 查找 <fb:name> 元素
*|tag :任何命名空间前缀中的标记的最终元素,例如 *|name 查找 <fb:name><name> 元素

选择器组合
el#id :带有 ID 的元素,例如 div#logo
el.class :具有类的元素,例如 div.masthead
el[attr] :具有属性的元素,例如 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 :查找同级 X 元素,其前面是同级 A,例如 h1 ~ p
el, el, el :将多个选择器分组,查找与任何选择器匹配的唯一元素;例如 div.masthead, div.logo

伪选择器
:has(selector) :查找包含与选择器匹配的元素的元素;例如 div:has(p)
:is(selector) :查找与选择器列表中任意选择器匹配的元素;例如 :is(h1, h2, h3, h4, h5, h6) 查找任何标题元素
:not(selector) :查找与选择器不匹配的元素;例如 div:not(.logo)
:contains(text) :查找包含给定文本的元素。搜索不区分大小写;例如 p:contains(jsoup)
:containsOwn(text) :查找直接包含给定文本的元素
:matches(regex) :查找文本与指定正则表达式匹配的元素;例如 div:matches((?i)login)
:matchesOwn(regex) :查找自身文本与指定正则表达式匹配的元素
:lt(n) :查找同级索引(即其在 DOM 树中相对于其父级的位置)小于 n 的元素;例如 td:lt(3)
:gt(n) :查找同级索引大于 n 的元素;例如 div p:gt(2)
:eq(n) :查找同级索引等于 n 的元素;例如 form input:eq(1)

使用 XPath 选择器查找元素和节点
 Document doc = Jsoup.connect("https://jsoup.org/").get();Elements elements = doc.selectXpath("//div[@class='col1']/p");// Each P element in div.col1List<TextNode> textNodes = doc.selectXpath("//a/text()", TextNode.class);// Each TextNode in every A element
从元素中提取属性、文本和 HTML
String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();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

希望允许不受信任的用户提供 HTML 以在您的网站上输出(例如作为评论提交)。您需要清理此 HTML 以避免跨站点脚本 (XSS) 攻击.

String unsafe = "<p><a href='http://example.com/' οnclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Safelist.basic());
// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

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

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

相关文章

实物+3D动画展示离心式过滤器的工作原理 #雨水收集#雨水过滤

产品规格型号 规格型号&#xff1a;LLLXGL-100、LLLXGL-150、LLLXGL-200、LLLXGL-300

第一届古剑山ctf-pwn全部题解

1. choice 附件&#xff1a; https://github.com/chounana/ctf/blob/main/2023%E7%AC%AC%E4%B8%80%E5%B1%8A%E5%8F%A4%E5%89%91%E5%B1%B1pwn/choice.zip 漏洞代码&#xff1a; 漏洞成因&#xff1a; byte_804A04C输入的长度可以覆盖nbytes的值&#xff0c;导致后面输入时存…

RFID复习内容整理

第一章 日常生活中的RFID技术 身份证&#xff08;高频&#xff09; typeB13.56MHz 一卡通&#xff08;高频&#xff09; ISO/IEC 14443 typeA 图书馆门禁停车场门票ETC 微波段、超高频 服装快销品牌 物联网定义 最初的定义 将各种信息传感设备&#xff0c;如射频识别(RFID)…

成功上岸最新Go面经:百度滴滴小米360小红书展盟优咔科技......

前言 本文整理了2023年最新的Go面试经验&#xff1a;涵盖了百度、滴滴、小米、360、小红书、展盟和优咔科技等知名公司的面试题目。 题目涉及Go语言基础知识、数据库知识、消息队列、Kubernetes相关知识、服务治理与微服务架构、Docker知识、监控和度量、算法与编程、自我介绍…

12.13 log

37. 解数独 class Solution { private:bool backtracking(vector<vector<char>>& board){for(int i0;i<board.size();i){for(int j0;j<board[0].size();j){if(board[i][j]!.) continue;for(char k1;k<9;k){if(isValid(i,j,k,board)){board[i][j]k;if…

会JSX没什么了不起,你了解过 StyleX 么?

近日&#xff0c;Meta开源了一款CSS-in-JS库 —— StyleX。看命名方式&#xff0c;Style - X是不是有点像JS - X&#xff0c;他们有关系么&#xff1f;当然有。 JSX是一种用JS描述HTML的语法规范&#xff0c;广泛应用于前端框架中&#xff08;比如React、SolidJS...&#xff0…

公众号怎么提高2个限制

一般可以申请多少个公众号&#xff1f;许多用户在申请公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号申请数量进行了调整&#xff0c;具体调整如下&#xff1a;1、个人主体申请公众号数量上限从2个调整为1个。2、企业主体申请公众号数…

Vue3 中的 Proxy--读懂ES6中的Proxy

Proxy用于创建一个对象的代理&#xff0c;从而实现基本操作的拦截和自定义&#xff08;如属性查找、赋值、枚举、函数调用等&#xff09; 1.用法 Proxy为 构造函数&#xff0c;用来生成 Proxy实例 var proxy new Proxy(target, handler)参数 target表示所要拦截的目标对象…

【LeetCode:2697. 字典序最小回文串 | 双指针 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

静态HTTP应用:理解其工作原理与优势

随着互联网的普及和发展&#xff0c;Web应用已经成为人们日常生活和工作中不可或缺的一部分。而静态HTTP应用作为Web应用的一种重要形式&#xff0c;也越来越受到开发者的青睐。本文将带你了解静态HTTP应用的工作原理和优势&#xff0c;让你更好地理解这种应用形式。 一、静态…

TallyBook Technical support

Thanks for using our app! If you have any problems using our products, please contact us by email and we will serve you 24 hours a day! Email address:eshanacsungmail.com Thank you!

binlog+mysqldump恢复数据(误删数据库或者表)

表删除恢复 1、准备数据 首先准备数据库环境&#xff0c;测试数据库为speech1&#xff0c;如下&#xff1a; 为test数据表添加3条记录&#xff0c;如下&#xff1a;三行为新加的记录&#xff0c;添加后将test表删除。 2、恢复数据 查看binlog日志状态 SHOW MASTER STATUS…

<软考高项备考>《论文专题 - 5 论文如何准备》

1 原创写作 优缺点缺点方法掌握写作方法和思路&#xff0c;参考几篇优质范文&#xff0c;就可以进行原创写作手上有项目的IT行业同学适合对象1、写作能力较强的朋友2、时间比较充格&#xff0c;喜欢钻研&#xff0c;善于运用各种工具&#xff0c;解决问题能力较强的朋友不会被…

多线程案例-定时器(附完整代码)

定时器是什么 定时器是软件开发中的一个重要组件.类似于一个"闹钟".达到一个设定的时间之后,就执行某个指定好的代码. 定时器是一种实际开发中非常常用的组件. 比如网络通信种,如果对方500ms内没有返回数据,则断开尝试重连. 比如一个Map,希望里面的某个key在3s之后过…

uniapp+vite+ts+express踩坑总结

1 关于引入express包报 import express from "express"; ^^^^^^ SyntaxError: Cannot use import statement outside a module的问题。 解决方案&#xff1a; 在package.json中添加type&#xff1a;“module”选项 2 Response is a type and must be imported …

c语言 词法分析器 《编译原理》课程设计

设计、编制并调试一个词法分析程序&#xff0c;加深对词法分析原理的理解。 针对表达各类词语的一组正规表达式&#xff0c;设计一个确定化的最简的有限自动机&#xff0c;对输入的符号串进行单词划分及词类识别。 要求词法分析器的输入是字符串&#xff0c;输出是源程序中各…

安装odoo17 Windows版时,PostgreSQL Database无法被勾选

安装odoo17 Windows版时&#xff0c;PostgreSQL Database无法被勾选。 出现的原因是&#xff0c;曾经安装过PostgreSQL Database&#xff1b;虽然可能已被卸载&#xff0c;但注册表内还有残余信息&#xff0c;导致odoo认为PostgreSQL Database仍存在于系统之中。 解决方案 删…

MySQL忘记root密码和修改root密码的解决方法

文章目录 &#xff08;1&#xff09;简介&#xff08;2&#xff09;MySQL 5.5 忘记root密码&#xff08;3&#xff09;MySQL 5.6 忘记root密码&#xff08;4&#xff09;MySQL 8.0 忘记root密码&#xff08;5&#xff09;MySQL 5.6修改root密码&#xff08;6&#xff09;MySQL …

美易官方:构建多元化证券投资组合

掌握美股投资的黄金法则&#xff1a;构建多元化证券投资组合 亲爱的投资者朋友们&#xff0c;当我们迈入充满活力与机遇的美股市场&#xff0c;我们的心中都满怀期待和激动。在这个全球关注的金融舞台上&#xff0c;如何构建一个可靠、安全且多样化的证券投资组合成为了一门艺…

三勾商城新功能-电子面单发货

商家快递发货时可以选择在线下单,在线获取和打印电子面单。免去手写面单信息以及避免填写运单号填错,系统会自动填写对应发货商品的运单信息 快递100电子面单1、进入快递100&#xff0c;点击登录 2、登录成功后&#xff0c;点击“电子面单与云打印” 3、进入电子面单与云打印后…