Android保存网页的方法
首先要使用js交互就需要懂原理:
感谢大佬:js中document节点获取页面元素的六种方式
1.querySelector()方法
描述:本方法用于根据给定的选择器选中页面元素
如果有多个元素满足条件,则返回第一个满足条件的元素节点
语法:document.querySelector('选择器名');
注意:如果查找失败,返回null
2.querySelectorAll()方法
描述:本方法用于根据给定的选择器选中页面元素
如果有多个元素满足条件,则返回这些元素构成的集合
语法:document.querySelectorAll('选择器名');
注意:
(1)返回的结果是一个节点列表,不是数组,但能够像使用数组一样使用列表
(2)如果查找失败,返回一个空的节点列表(.length==0)
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>document节点获取页面元素</title></head><body><div id="div">我是第一个div</div><div class="div">我是第二个div</div><div>我是第三个div</div><p>我是p标签</p><h2>我是h2标签</h2><button name="aaa">我是button</button></body><script type="text/javascript">var div = document.querySelector('#div');console.log(div); //<div class="div">我是第二个div</div>var div = document.querySelector('div');console.log(div); //<div id="div">我是第一个div</div>var divList = document.querySelectorAll('div');console.log(divList); //NodeList(3) [div#div, div.div, div]console.log(divList[1]); //<div class="div">我是第二个div</div>console.log(divList.length); //3 </script>
</html>
3.getElementById()方法
描述:根据指定的id名选中页面元素
如果存在多个指定 满足条件元素,则返回第一个元素节点
语法:document.getElementById('id名');
注意:如果查找失败,返回null
4.getElementsByClassName()方法
描述:根据指定的类名选中页面中所有满足条件的元素
语法:document.getElementsByClassName('类名');
注意:返回结果是一个有顺序的节点列表,可以通过索引来访问列表中的元素(索引从0开始)
5.getElementsByTagName()方法
描述:根据指定的标签名选中页面中所有满足条件的元素
语法:document.getElementsByTagName('标签名');
注意:如果参数值为'*',则返回文档中的所有元素
6.getElementsByName()方法
描述:根据指定的name值选中页面中所有满足条件的元素
语法:document.getElementsByName('name属性');
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>document节点获取页面元素</title></head><body><div id="div">我是第一个div</div><div class="div">我是第二个div</div><div>我是第三个div</div><p>我是p标签</p><h2>我是h2标签</h2><button name="aaa">我是button</button></body><script type="text/javascript">var a = document.getElementById('div');console.log(a); //<div id="div">我是第一个div</div>var b = document.getElementsByClassName('div');console.log(b); //HTMLCollection [div.div]var c = document.getElementsByTagName('p');console.log(c); //HTMLCollection [p]var d = document.getElementsByName('aaa');console.log(d); //NodeList [button] </script>
</html>
然后,使用python也可以,但是作为Android开发,学习新的语言配置环境也是有成本的,自己写的虽然丑但是够用,所以,以下:
mWebView?.webViewClient = object : WebViewClient() {override fun onPageFinished(view: WebView, url: String) {mWebView?.evaluateJavascript("document.getElementsByTagName('html')[0].innerHTML;") { value ->Log.e("aaaaa", "load:${url}")if (lastUrl == url) {var title = url.substring(url.lastIndexOf("/"), url.length)mWebView?.evaluateJavascript("document.getElementsByClassName('article-title text-center')[0].innerHTML;") { titleStr ->if (titleStr.isNotEmpty()) {title = titleStr.replace("\"", "").replace("?", "").replace("?", "").replace("\\n", "").replace("/", "、")}}mWebView?.evaluateJavascript("document.getElementById('article-content').innerHTML;") { contentStr ->val file = File(Environment.getExternalStorageDirectory().toString() + File.separator + "html/" + "$title.html")val content = contentStr.replace("\\u003C", "<").replace("\\n", "").replace("\\\"", "\"")val fw = FileWriter(file)fw.write(getHtmlData(content))fw.close()Log.e("aaaaa", "${file.absolutePath}保存成功!")endCheck()}} else if (value.contains("你访问的资源找不到了")) {Log.e("aaaaa", "${url}页面无法访问。。。")endCheck()}lastUrl = url}super.onPageFinished(view, url)}}fun getHtmlData(bodyHTML: String?): String {val head = "<head>" +"<meta charset=\"utf-8\">" +"<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,user-scalable=no\">" +"<style>" +"table {font-size: 14px !important;width: 100% !important;" +"text-align: center;border: 1px solid #dee2e6;border-collapse: collapse;border-spacing: 0;}" +"table td {border: 1px solid #dee2e6;padding: 0 !important;width: auto !important;" +" word-wrap: break-word;word-break: break-all;overflow: hidden;text-align: center !important;vertical-align:middle !important;}" +"table td span {font-size: 14px !important;text-align: center !important;vertical-align:middle !important;}" +"p {font-size: 14px !important;}" +"</style>" +"</head>"return "<html>$head<body><div style=\"overflow: auto;font-size: 14px !important;width: 100% !important;\">$bodyHTML</div></body></html>";}
只是能完成任务,没有仔细打磨,很粗糙,不过还是那句话,丑但是够用,需要的话可以打磨一下,就没有那么丑了。
相关文章:
Android保存网页的方法
首先要使用js交互就需要懂原理: 感谢大佬:js中document节点获取页面元素的六种方式 1.querySelector()方法 描述:本方法用于根据给定的选择器选中页面元素 如果有多个元素满足条件,则返回第一个满足条件的元素节点 语法ÿ…...
P2P 网络,PING程序。
没有废话,直接上版本号和代码,以及讲解。 crate版本号libp2p0.52.1tokio1.30.0依赖配置: [dependencies] tokio = { version="1.30.0", features=["full"] } libp2p = { version="0.52.1", features=["tokio","dns", &q…...
OPENCV C++(十二)模板匹配
正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法,一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为…...
【配置环境】Linux下安装MySQL
目录 一,环境 二,安装步骤 1.使用包管理器安装MySQL 2.配置MySQL的安全选项 3.设置root用户使用密码进行身份验证(可选) 三,拓展知识 1.如何修改MySQL的密码策略? 一,环境 VMware Workst…...
【100天精通python】Day30:使用python操作数据库_数据库基础入门
专栏导读 专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html 1 数据库基础知识介绍 1.1 什么是数据库? 数据库是一个结构化存储和组织数据的集合,它可以被有效地访问、管理和更新。数据库的目的是为了提供一种可靠的…...
android 如何分析应用的内存(十八)终章——使用Perfetto查看内存与调用栈之间的泄露
android 如何分析应用的内存(十八) 在前面两篇文章中,先是介绍了如何用AS查看Android的堆内存,然后介绍了使用MAT查看 Android的堆内存。AS能够满足基本的内存分析需求,但是无法进行多个堆的综合比较,因此…...
arcpy实现kml批量转出为shp 包括shp合并
参考文章 arcpy实现 kml批量转出为shp_kml批量合并转shp_A873054267的博客-CSDN博客 参考帮助是arcgis里边自带的KMLToLayer_conversion函数 应用场景: 两步路产生的多个轨迹文件KML,批量转换成arcgis 的gdb数据库 最后合并成一个shp 第一步&#…...
高等数学:泰勒公式
注:第三条 e x e^x ex的展开式,在 1 1 1和 1 2 x 2 \frac{1}{2}x^2 21x2之间添上一个 x x x。 1 1 − x ∑ n 0 ∞ x n 1 x x 2 x 3 ο ( x 3 ) , x ∈ ( − 1 , 1 ) . \begin{aligned}\frac{1}{1-x}\sum_{n0}^\infty x^n1xx^2x^3\omicron(x^…...
JZ32 从上往下打印二叉树(Java)
题目地址:从上往下打印二叉树_牛客题霸_牛客网 题目回顾: 不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印&…...
hackNos靶机
靶机训练1 - hackNos: Os-hackNos 靶机平台 Vulnhub 是一个提供各种漏洞环境的靶场平台,供安全爱好者学习使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目…...
取地址及 const取地址操作符重载
取地址及 const取地址操作符重载 #include <iostream> using namespace std;class A { public:A(int year, int month, int day){_year year;_month month;_day day;}//它们是默认成员函数,我们不写编译器会自动生成,自动生成就够用了ÿ…...
【Linux初阶】进程间通信介绍 管道
🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:进程间通信介绍,管道概述,匿名管道应用,命名管道应用 🚢&#…...
App 在macOS Catalina下提示已损坏无法打开解决办法:
App 在macOS Catalina下提示已损坏无法打开解决办法: 打开终端; 输入以下命令,回车; sudo xattr -d com.apple.quarantine /Applications/xxxx.app注意:/Applications/xxxx.app 换成你的App路径(推荐直接…...
ad+硬件每日学习十个知识点(26)23.8.6 (DCDC的降压电路、升压电路、降压-升压电路,同步整流,选型考虑同步、隔离)
文章目录 1.DCDC的降压原理2.DCDC的升压原理3.DCDC的升压和降压原理4.什么是肖特基二极管造成的死区电压?5.MOS管有死区电压么?6.DCDC的同步整流(用MOS管取代整流二极管,避免死区电压的影响)7.DCDC选型——同步与非同步…...
Elasticsearch3节点集群配置账号密码安全验证
Elasticsearch3节点集群配置账号密码安全验证 ES配置文件 rootnode1:~# grep -Ev "^#|^$" /etc/elasticsearch/elasticsearch.yml cluster.name: es-pre node.name: node1 node.master: true node.data: true path.data: /data/elk/es/data path.logs: /data/elk/…...
ffmepg滤镜
视频按顺时针方向旋转90度 ffplay -vf transpose1 -i juren-30s.mp4 ffplay -f lavfi -i testsrc -vf transpose1 -f lavfi -i testsrc这个滤镜是ffmpeg给用户的一个测试使用的视频 视频水平翻转(左右翻转) -vf hflip 实现慢速播放,声音速度是原始速度的50% ffpla…...
Linux 基础(六)常用命令 - find locate which whereis gzip gunzip tar
find & locate & which & whereis & gzip & gunzip & tar findlocatewhichwhereisgzipgunzipzip/unziptar find 在指定目录下查找文件或目录 find --help Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...…...
【Ajax】回调地狱解决方法
回调地狱(Callback Hell)是指在异步编程中,特别是在嵌套的回调函数中,代码变得深度嵌套、难以阅读和维护的现象。这通常发生在处理多个异步操作时,每个操作都依赖于前一个操作的结果。回调地狱使代码变得难以理解、扩展…...
解决Vue根组件设置transition失效的问题
解决Vue根组件设置transition失效的问题 1.代码 <div id"app"><!-- :name"$route.meta.transitionName" --><transition :name"animation" mode"out-in"><router-view /></transition></div>&…...
【剑指 Offer 40】最小的k个数
题目: 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。 示例: 输入:arr [3,2,1], k 2 输出:[1,2] 或者 [2,1] …...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
