腾讯在线文档下载文档html格式

腾讯在线文档下载文档html格式

步骤

  1. chrome 浏览器打开该文档(edge不行)

  2. 同时按住ctrl+p快捷键调出腾讯文档内置的打印页面,打印范围要选择整个工作薄纸张建议调大一点,边距建议较窄,缩放要选择宽度撑满,不然可能会有内容太宽而显示不出来
    在这里插入图片描述

  3. 可能要等加载打印预览,耐心等待

判断是否卡死可以看url的?tab=xxx参数是否变化,如果在变则没有卡死
在这里插入图片描述

  1. 按下F12快捷键,用检查模式,找到你要定位的标签(需要观察这个标签是不是滚动屏幕更改了内容)

ctrl+f快捷键在元素中查找文本也可以定位到附近,这里需要具体情况具体分析
其实在这一步时如果图方便可以点击下一步按钮,会导出pdf格式,但是如果文件很大的话,会卡死

  1. 获取该标签完整xpath,输入到输入框中
  2. 点击开始监控按钮,油猴脚本(放在文末)就开始监视你输入的xpath元素的一级子元素变化了,会将没有出现过的子元素追加到该xpath元素元素中
  3. 不断向下滑动屏幕(不划动之后的内容不会刷新,也不要太快了,可能程序跟不上),一直滑动到打印预览区域的底部
    在这里插入图片描述
  4. 点击导出内容,下载保存的xpath元素,如果担心不全的话,可以多次上下滑动滚动条,直到导出的文件大小不再变化
  5. 可以使用python代码(文末)删除js和css代码,使得界面更清晰

油猴脚本

// ==UserScript==
// @name         Monitor and Save Div Content
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Monitor a specific div element and save its content, including child elements. Append new content and provide an export button.
// @match        *://*/*
// @grant        none
// ==/UserScript==(function() {'use strict';// 存储div内容的数组let divContent = [];// 存储目标div的XPathlet targetDivXPath = '';// 存储MutationObserver实例let observer;// 存储目标div元素let targetDiv;// 存储开始监控的时间let startTime = null;// 存储导出文件的时间let endTime = null;// 这里的几个按钮位置很混乱,仍然需要重新排列// 创建输入框用于输入XPathconst inputBox = document.createElement('input');inputBox.type = 'text';inputBox.placeholder = 'Enter XPath here';inputBox.style.position = 'fixed';inputBox.style.top = '10px';inputBox.style.right = '300px';inputBox.style.zIndex = '9999';inputBox.addEventListener('keydown', function(event) {if (event.key === 'Enter') {startMonitoring();}});document.body.appendChild(inputBox);// 创建开始按钮const startButton = document.createElement('button');startButton.textContent = '开始监控';startButton.style.position = 'fixed';startButton.style.top = '10px';startButton.style.right = '350px';startButton.style.zIndex = '9999';startButton.addEventListener('click', startMonitoring);document.body.appendChild(startButton);// 创建停止按钮const stopButton = document.createElement('button');stopButton.textContent = '停止监控';stopButton.style.position = 'fixed';stopButton.style.top = '10px';stopButton.style.right = '400px';stopButton.style.zIndex = '9999';stopButton.addEventListener('click', stopMonitoring);document.body.appendChild(stopButton);// 创建导出按钮const exportButton = document.createElement('button');exportButton.textContent = '导出内容';exportButton.style.position = 'fixed';exportButton.style.top = '30px'; // Move down to the next lineexportButton.style.right = '300px';exportButton.style.zIndex = '9999';exportButton.addEventListener('click', exportContent);document.body.appendChild(exportButton);function startMonitoring() {// 清空divContent数组divContent = [];targetDivXPath = inputBox.value.trim();if (!targetDivXPath) {alert('请输入有效的XPath。');return;}// 停止之前的监控,如果存在if (observer) {stopMonitoring();}try {targetDiv = document.evaluate(targetDivXPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;if (!targetDiv) {alert('无法找到目标div元素,请检查XPath是否正确。');return;}// 获取当前时间startTime = new Date();// 保存当前div的内容saveCurrentDivContent(targetDiv);observer = new MutationObserver(function(mutations) {mutations.forEach(function(mutation) {if (mutation.type === 'childList') {const addedNodes = mutation.addedNodes;for (let i = 0; i < addedNodes.length; i++) {const newContent = addedNodes[i].outerHTML;// 虽然大部分去重了,但是好像仍然有少部分重复if (!divContent.includes(newContent)) {divContent.push(newContent);}}}});});const config = { childList: true, subtree: true };observer.observe(targetDiv, config);startButton.textContent = '监控中...';startButton.disabled = true;stopButton.disabled = false; // 启用停止按钮inputBox.disabled = true;} catch (e) {alert('XPath无效或页面未完全加载,请刷新页面后重试。');}}function stopMonitoring() {if (observer) {observer.disconnect();observer = null;}startButton.textContent = '开始监控';startButton.disabled = false;stopButton.disabled = true; // 禁用停止按钮inputBox.disabled = false;alert('监控已停止。');}function exportContent() {if (divContent.length === 0) {alert('当前没有内容可以导出。');return;}let startTime2 = startTime.getFullYear() + '-' + (startTime.getMonth() + 1).toString().padStart(2, '0') + '-' + startTime.getDate().toString().padStart(2, '0') + ' ' + startTime.getHours().toString().padStart(2, '0') + ':' + startTime.getMinutes().toString().padStart(2, '0') + ':' + startTime.getSeconds().toString().padStart(2, '0');endTime = new Date();let endTime2 = endTime.getFullYear() + '-' + (endTime.getMonth() + 1).toString().padStart(2, '0') + '-' + endTime.getDate().toString().padStart(2, '0') + ' ' + endTime.getHours().toString().padStart(2, '0') + ':' + endTime.getMinutes().toString().padStart(2, '0') + ':' + endTime.getSeconds().toString().padStart(2, '0');// 获取当前页面的URLconst currentUrl = window.location.href;// 创建包含元数据的HTML字符串const metadataHtml = `<div style="background-color: #f0f0f0; padding: 10px; margin-top: 30px; border: 1px solid #ccc; font-weight: bold; text-align: center;"><p>开始导出时间: ${startTime2}</p><p>导出结束时间: ${endTime2}</p><p>保存网址: ${currentUrl}</p><p>声明代码来源: <a href="https://blog.csdn.net/qq_33843237/article/details/136719243" target="_blank">CSDN博客</a></p><p>其他信息: 此文档由油猴脚本导出,记录了特定div元素的内容变化。</p><hr style="border: 0; height: 2px; background-color: #333; margin-top: 10px;" /></div>`;// 将元数据HTML和div内容合并const content = metadataHtml + divContent.join('\n');// 创建Blob对象const blob = new Blob([content], { type: 'text/html' });// 创建下载链接const url = URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = 'div_content.html';link.click();// 释放URL对象URL.revokeObjectURL(url);}function viewDivContent() {if (divContent.length === 0) {alert('当前没有内容可以查看。');return;}alert(divContent.join('\n'));}function saveCurrentDivContent(targetDiv) {const currentContent = targetDiv.innerHTML;divContent = [currentContent]; // 保存当前内容作为初始状态}
})();

python代码

import os
import re
from tkinter import Tk, filedialog, messagebox, simpledialog
from bs4 import BeautifulSoup, NavigableStringdef remove_css_js(soup):# 移除所有style标签的内容,但保留标签(以便保留文本)for style in soup.find_all('style'):style.string = ''# 移除所有script标签的内容,但保留标签(以便保留文本)for script in soup.find_all('script'):script.string = ''# 移除所有内联样式for element in soup.find_all(style=True):element.attrs.pop('style', None)# 移除所有内联事件处理器(例如 onclick)for attr in ['onclick', 'onmouseover', 'onmouseout', 'onload', 'onerror']:for element in soup.find_all(True):if attr in element.attrs:element.attrs.pop(attr, None)# 移除所有链接到CSS文件的link标签for link in soup.find_all('link', rel=re.compile(r'stylesheet')):link.decompose()# 移除所有JavaScript文件的引用for script in soup.find_all('script', src=True):script.decompose()# 移除所有内嵌的CSS和JavaScript代码for tag in soup.find_all(True):if tag.name in ['style', 'script']:tag.replace_with(NavigableString(tag.string or ''))def clean_html_file(file_path):with open(file_path, 'r', encoding='utf-8') as html_file:soup = BeautifulSoup(html_file, 'html.parser')remove_css_js(soup)# 清理后的HTML内容,保留文本cleaned_html = str(soup)return cleaned_htmldef save_cleaned_html(cleaned_html, title='保存清理后的HTML文件'):root = Tk()root.withdraw()file_path = filedialog.asksaveasfilename(title=title,defaultextension=".html",filetypes=(("HTML files", "*.html"), ("All files", "*.*")))if not file_path:messagebox.showerror("错误", "没有选择保存路径。")return Nonetry:with open(file_path, 'w', encoding='utf-8') as new_html_file:new_html_file.write(cleaned_html)messagebox.showinfo("成功", "文件已成功保存。")return file_pathexcept Exception as e:messagebox.showerror("错误", f"保存文件时发生错误: {e}")return Nonedef main():root = Tk()root.withdraw()# 选择HTML文件file_path = filedialog.askopenfilename(title="选择HTML文件",defaultextension=".html",filetypes=(("HTML files", "*.html"), ("All files", "*.*")))if not file_path:messagebox.showerror("错误", "没有选择文件。")returntry:# 清理HTML文件cleaned_html = clean_html_file(file_path)# 保存清理后的HTML文件export_path = save_cleaned_html(cleaned_html)# 如果保存成功,打开保存的文件if export_path:os.startfile(export_path)except Exception as e:messagebox.showerror("错误", f"处理文件时发生错误: {e}")if __name__ == "__main__":main()

声明

本文仅供学习参考,一切责任与我无关。主要代码均由ChatGPT生成。

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

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

相关文章

“风口”上的量化大厂“绣球”抛向中低频人才

量化人才这几年是人才舞台上的“香饽饽”。 遵循着低频不如高频、小厂不如大厂的薪资逻辑&#xff0c;各路人才被各路机构“哄抢”&#xff0c;薪资一路走高。 但2024年的“信号”再强烈不过——量化大厂们到了改变的时候了。 而量化大厂们显然对此已“心知肚明”....... “…

空气源热泵、地源热泵和水源热泵三种热泵的优缺点和选型比较

空气源热泵 空气源热泵是由电动机驱动的,利用空气中的热量作为低温热源,经过空调冷凝器或蒸发器进行热交换,然后通过循环系统,提取或释放热能,利用机组循环系统将能量转移到建筑物内用户需求。 1、适用范围广:适用温度范围在-7至40℃,并且一年四季全天候使用,不受阴、…

软件测试 —— 案例系统缺陷报告

知识&#xff1a; 1、缺陷等级&#xff1a; 1-Urgent(致命错误)&#xff1a;影响全局的死机、通信中断、重要业务不能完成 2-Very High(严重错误)&#xff1a;规定的功能没有实现或不完整或产生错误结果&#xff1b;使系统不稳定、或破坏数据等 3-High(一般错误)&#xff1a;…

Github 2024-03-16 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目2Go项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Gene…

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比&#xff0c;HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言&#xff0c;拥有成熟的社区和广泛的浏览器支持&#xff0c;HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站&#xff0c; 你可能顺利地使用chatGPT、Gemini&#xff0c; 用得很happy。 突然有一天&#xff0c;你发现一些网站&#xff0c;除了chatGPT、Gemini &#xff0c;还可以切换使用国内外其他的大模型…

Pulsar 社区周报 | No.2024.03.15 LTS 3.0.3 新版发布

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;周五发布。 ” 本期主题&#xff1a;LTS 3.0.3 发布 Apache Pulsar 新版发布&#xff1a; LTS&#xff08;稳定性长期支持版&#xff09;新版&am…

SpringMVC基础之工作流程

文章目录 SpringMVC 的工作流程1. 总图2. DispatcherServlet3. 必需的配置4. 加载配置文件的两个时机5. 定义控制器6. 创建 JSP 视图 SpringMVC 的工作流程 1. 总图 如上图&#xff0c;Spring MVC 程序的完整执行流程如下&#xff1a; 用户通过浏览器发送请求&#xff0c;请求…

Docker 系列2【docker安装mysql】【开启远程连接】

文章目录 前言开始步骤1.增加mysql挂载目录2.下载镜像2.启动容器具体步骤4.无法连接5.测试连接 总结 前言 本文开始&#xff0c;默认已经安装docker&#xff0c;如果你还没有完成这个步骤&#xff0c;请查看这一篇文章【docker安装与使用】 开始步骤 1.增加mysql挂载目录 m…

【Unity】进度条和血条的三种做法

前言 在使用Unity开发的时候&#xff0c;进度条和血条是必不可少的&#xff0c;本篇文章将简单介绍一下几种血条的制作方法。 1.使用Slider Slider组件由两部分组成&#xff1a;滑动区域和滑块。滑动区域用于显示滑动条的背景&#xff0c;而滑块则表示当前的数值位置。用户可…

双线性插值缩放算法原理以及matlab与verilog的实现(二)

系列文章目录 双线性插值缩放算法原理以及matlab与verilog的实现&#xff08;一&#xff09; 文章目录 系列文章目录前言一、前提回顾二、FPGA实现步骤2.1 找到源图像四个像素点求目标像素点2.2 FPGA实现步骤2.3 总体框架2.4 ROM缓存模块2.5 VGA模块2.6 双线性算法模块 三、下…

mysql实战开发之 mysql 删除一张表某个字段的sql语句

有一张表, 我需要删除这张表其中的某一个或者某几个字段, 相信大家在日常开发中应该会遇到这种情况, 然后刚好自己接触的项目安装的mysql关闭了允许远程连接的设置, 也就是说不允许使用类似于navicat 等可视化工具连接, 那么就没办法通过可视化工具直接去通过鼠标操作就可以 完…

【MySQL 系列】MySQL 语句篇_DDL 语句

DDL&#xff08; Data Definition Language&#xff0c;数据定义语言&#xff09;用在定义或改变表的结构数据类型、表之间的链接和约束等初始化工作上。常用的语句关键字包括 CREATE、 DROP、 ALTER 等。 文章目录 1、MySQL 中的 DQL 语句2、MySQL 中库表的 DQL 语句详解2.1、…

【算法与数据结构】深入解析二叉树(二)之堆结构实现

文章目录 &#x1f4dd;二叉树的顺序结构及实现&#x1f320; 二叉树的顺序结构&#x1f320; 堆的实现&#x1f320; 堆的实现&#x1f309;堆向下调整算法&#x1f309;堆的创建&#x1f309;建堆时间复杂度&#x1f309;堆的插入&#x1f309;堆的删除 &#x1f320;堆向上调…

详细分析Java中Stream流和for循环的差异之处

目录 前言1. 基本知识2. Demo 前言 事情起因是遍历大数据的时候&#xff0c;数据卡顿很严重 对于Java的基本知识推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; 1. 基本知识 在Java中&#xff0c;Stream API提供…

dockers拉取MySQL及Redis并挂载文件

目录 一 . MySQL拉取 1、进入 MySQL 容器内部。 2、登录 MySQL。 3、修改远程连接 4、刷新 二 . Redis拉取 1 . redis/conf中新建文件redis.conf&#xff0c;内容如下&#xff1a; 2 . 容器运行 一 . MySQL拉取 docker run -d --restartalways --name mysql \ -v /…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…

Day43-2-企业级实时复制intofy介绍及实践

Day43-2-企业级实时复制intofy介绍及实践 1. 企业级备份方案介绍1.1 利用定时方式&#xff0c;实现周期备份重要数据信息。1.2 实时数据备份方案1.3 实时复制环境准备1.4 实时复制软件介绍1.5 实时复制inotify机制介绍1.6 项目部署实施1.6.1 部署环境准备1.6.2 检查Linux系统支…

中电金信:技术实践|Flink维度表关联方案解析

导语&#xff1a;Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架&#xff0c;主要用来处理流式数据。它既可以处理有界的批量数据集&#xff0c;也可以处理无界的实时流数据&#xff0c;为批处理和流处理提供了统一编程模型。 维度表可以看作是用户来分析数…

JavaScript进阶:js的一些学习笔记-this指向,call,apply,bind,防抖,节流

文章目录 1. this指向1. 箭头函数 this的指向 2. 改变this的指向1. call()2. apply()3. bind() 3. 防抖和节流1. 防抖2. 节流 1. this指向 1. 箭头函数 this的指向 箭头函数默认帮我们绑定外层this的值&#xff0c;所以在箭头函数中this的值和外层的this是一样的箭头函数中的…