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>";}

只是能完成任务,没有仔细打磨,很粗糙,不过还是那句话,丑但是够用,需要的话可以打磨一下,就没有那么丑了。

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

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

相关文章

GRPC-连接池-GPT

gRPC Dart 管理优化 User grpc for dart 如何统一管理多个Client的创建和销毁&#xff0c;给我一个最优解 ChatGPT 对于在Dart中使用gRPC创建和销毁多个Client的统一管理&#xff0c;您可以使用一个单例模式的管理类来实现最优解。 首先&#xff0c;创建一个管理类&#xff0c…

EPPlus 读取和生成Excel

在项目中添加了EPPlus库的引用&#xff0c;你可以通过NuGet包管理器或手动将EPPlus库添加到项目中。同时&#xff0c;需要注意的是EPPlus库支持的是xlsx格式的Excel文件。 读取 使用EPPlus读取本地Excel文件的示例代码如下&#xff1a; using OfficeOpenXml;public void Rea…

算法随笔:图论问题之割点割边

割点 定义 割点的定义&#xff1a;如果一个点被删除之后会导致整个图不再是一个连通图&#xff0c;那么这个顶点就是这个图的割点。举例&#xff1a; 上图中的点2就是一个割点&#xff0c;如果它被删除&#xff0c;则整个图被分为两个连通分量&#xff0c;不再是一个连通图。…

【交换排序】冒泡排序 与 快速排序

交换排序基本思想&#xff1a; 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 目录 1.冒泡排序 2.快…

OptaPlanner笔记5

2.4 与spring boot集成 2.4.4 添加依赖 <dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-spring-boot-starter</artifactId> </dependency>2.4.8 创建求解器服务 import org.optaplanner.core.api.solver.Solv…

Django笔记之数据库函数之日期函数

日期函数主要介绍两个大类&#xff0c;Extract() 和 Trunc() Extract() 函数作用是提取日期&#xff0c;比如我们可以提取一个日期字段的年份&#xff0c;月份&#xff0c;日等数据 Trunc() 的作用则是截取&#xff0c;比如 2022-06-18 12:12:12&#xff0c;我们可以根据需求…

CSS:弹性盒子模型详解(用法 + 例子 + 效果)

目录 弹性盒子模型flex-direction 排列方式 主轴方向换行排序控制子元素缩放比例缩放是如何实现的&#xff1f; 控制子元素的对其方式justify-content 横向 对齐方式align-items 纵向 对齐方式 align-content 多行 对齐方式 弹性盒子模型 flex-direction 排列方式 主轴方向 f…

CI+JUnit5并发单测机制创新实践

目录 一. 现状问题 二. 分析原因 三. 采取措施 四. 实践步骤 五. 效能提升 资料获取方法 一. 现状问题 针对现如今高并发场景的业务系统&#xff0c;“并发问题” 终归是必不可少的一类&#xff08;占比接近10%&#xff09;&#xff0c;每次出现问题和事故后&#xff0c…

CNN经典网络模型之GoogleNet论文解读

目录 1. GoogleNet 1.1 Inception模块 1.1.1 1x1卷积 1.2 辅助分类器结构 1.3 GoogleNet网络结构图 1. GoogleNet GoogleNet&#xff0c;也被称为Inception-v1&#xff0c;是由Google团队在2014年提出的一种深度卷积神经网络架构&#xff0c;专门用于图像分类和特征提取任…

vConsole手机调试模式uniapp和原生h5

手机打开调试模式的方法 尽量放在页面头部&#xff0c;底部有可能不行 原生 <script src"https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script> <script>// init vConsolevar vConsole new VConsole();console.log(Hello world)…

ElasticSearch安装与启动

ElasticSearch安装与启动 【服务端安装】 1.1、下载ES压缩包 目前ElasticSearch最新的版本是7.6.2&#xff08;截止2020.4.1&#xff09;&#xff0c;我们选择6.8.1版本&#xff0c;建议使用JDK1.8及以上。 ElasticSearch分为Linux和Window版本&#xff0c;基于我们主要学习…

Linux服务器映射到本地磁盘

内容来自网友博客。 把linux服务器上的文件夹映射到本地作为一个磁盘来访问&#xff0c;步骤如下 一. samba的安装: sudo apt-get install samba // (sudo get temp root auth) sudo apt-get install smbfs //旧版本 sudo apt-get install cifs-utils //新版本 上…

【reactNative混合安卓开发~使用问题持续更】

reactNative混合安卓开发 reactNative开发移动端reactNative界面开发前端init.bat文件部分组件第三方组件解析1、定义theme主题shopify/restyle&#xff1b;菜单导航react-navigation/drawer、react-navigation/native&#xff1b; RN问题记录1、使用theme.js写的公共组件报错&…

【博客699】docker daemon预置iptables剖析

docker daemon预置iptables剖析 没有安装docker的机器&#xff1a;iptables为空&#xff0c;且每个链路的默认policy均为ACCEPT [root~]# iptables-save[root ~]# iptables -t raw -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt …

k8s node 误删除了如何自动创建 csr重新加入集群

worker node 节点当部署晚 kubelet、kube-proxy就会加入集群&#xff0c;如何加入呢&#xff0c; [rootkube-node01 ssl]# mv kubelet-client-2023-08-13-01-19-00.pem kubelet-client-current.pem kubelet.crt kubelet.key /tmp/kubelet [rootkube-node01 ssl]# systemctl da…

Java 正则表达式【基本语法】

基本介绍 首先我们需要了解的是正则表达式中的各种元字符的功能&#xff0c;主要分为以下几种&#xff1a; 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 需要注意的是&#xff1a;在 Java正则表达式中&#xff0c;两个斜杠 \\ 相当于其它语言中的一个斜杠…

认识vite

一.了解vite的不同版本的更新 vite1版本是基于vue项目的&#xff0c;无法跨框架使用vite2可以跨框架&#xff08;vue2&#xff0c;vue3&#xff0c;react&#xff09;vite3模板变更&#xff1b;vite cli优化&#xff1b;import.meta.glob API变化&#xff1b;其他vite4主版本主…

Django框架-使用celery(一):django使用celery的通用配置,不受版本影响

目录 一、依赖包情况 二、项目目录结构 2.1、怎么将django的应用创建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相关处理视图 4.1、基本…

【数据结构】复杂度

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、什么是数据结构 二、什么是算法 三、算法的效率 四、时间复杂度 4.…

k8s基础

k8s基础 文章目录 k8s基础一、k8s组件二、k8s组件作用1.master节点2.worker node节点 三、K8S创建Pod的工作流程&#xff1f;四、K8S资源对象1.Pod2.Pod控制器3.service && ingress 五、K8S资源配置信息六、K8s部署1.K8S二进制部署2.K8S kubeadm搭建 七、K8s网络八、K8…