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] …...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
