有没有什么办法将网页的指定dom元素及子元素的所有css导出?
网友回复
写一个油猴脚本实现,具体的脚本代码
// ==UserScript==
// @name 网页DOM树和CSS样式导出器
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 导出网页完整的DOM树结构和所有CSS样式
// @author You
// @match *://*/*
// @grant none
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// ==/UserScript==
(function() {
'use strict';
// 创建导出按钮
function createExportButton() {
// 检查按钮是否已存在
if (document.getElementById('export-dom-css-btn')) return;
// 创建按钮
const button = document.createElement('button');
button.id = 'export-dom-css-btn';
button.textContent = '导出DOM和CSS';
button.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
z-index: 999999;
padding: 10px 15px;
background: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
`;
// 添加悬停效果
button.addEventListener('mouseenter', () => {
button.style.background = '#45a049';
});
button.addEventListener('mouseleave', () => {
button.style.background = '#4CAF50';
});
// 点击事件
button.addEventListener('click', exportDOMAndCSS);
// 添加到页面
document.body.appendChild(button);
}
// 导出DOM和CSS
function exportDOMAndCSS() {
try {
// 获取完整的DOM树
const domTree = getDOMTree();
// 获取所有CSS样式
const cssStyles = getAllCSSStyles();
// 生成完整的HTML文档
const fullHTML = generateFullHTML(domTree, cssStyles);
// 下载文件
downloadFile(fullHTML, `dom-export-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.html`);
alert('DOM树和CSS样式导出成功!');
} catch (error) {
console.error('导出失败:', error);
alert('导出失败: ' + error.message);
}
}
// 获取完整的DOM树结构
function getDOMTree() {
// 克隆整个文档
const clonedDoc = document.cloneNode(true);
// 移除脚本标签以避免执行
const scripts = clonedDoc.querySelectorAll('script');
scripts.forEach(script => script.remove());
// 移除导出按钮
const exportBtn = clonedDoc.getElementById('export-dom-css-btn');
if (exportBtn) exportBtn.remove();
// 移除可能的油猴脚本元素
const tampermonkeyElements = clonedDoc.querySelectorAll('[id^="tampermonkey"], [class^="tampermonkey"]');
tampermonkeyElements.forEach(el => el.remove());
return clonedDoc;
}
// 获取所有CSS样式
function getAllCSSStyles() {
let allCSS = '';
// 1. 获取所有内联样式表
for (let i = 0; i < document.styleSheets.length; i++) {
try {
const sheet = document.styleSheets[i];
const cssText = getCSSFromStyleSheet(sheet);
if (cssText) {
allCSS += `/* 样式表 ${i + 1} */\n${cssText}\n\n`;
}
} catch (error) {
console.warn(`无法获取样式表 ${i}:`, error);
}
}
// 2. 获取所有内联样式
const inlineStyles = getInlineStyles();
if (inlineStyles) {
allCSS += `/* 内联样式 */\n${inlineStyles}\n\n`;
}
// 3. 获取计算样式(可选,会很大)
// const computedStyles = getComputedStyles();
// if (computedStyles) {
// allCSS += `/* 计算样式 */\n${computedStyles}\n\n`;
// }
return allCSS;
}
// 从样式表获取CSS文本
function getCSSFromStyleSheet(sheet) {
try {
// 如果是内联样式表
if (sheet.cssRules) {
let cssText = '';
for (let j = 0; j < sheet.cssRules.length; j++) {
cssText += sheet.cssRules[j].cssText + '\n';
}
return cssText...点击查看剩余70%
如何用html写出网页滚动视频播放卡片视觉差异效果的代码?
程序员如何低成本搭建代理进行科学上网学习技术?
threejs如何做个三维搭积木的游戏?
three如何实现标记多个起始路过地点位置后选择旅行工具(飞机汽车高铁等),最后三维模拟行驶动画导出mp4?
ai实时驱动的3d数字人可视频聊天的开源技术有吗
swoole+phpfpm如何实现不同域名指向不同目录的多租户模式?
如何用go替换nginx实现请求phpfpm解析运行php脚本?
有没有浏览器离线运行进行各种文档、图片、视频格式转换的开源工具?
如何使用go语言搭建一个web防火墙?
linux如何检测特定网络协议比如http协议中报文是否包含特点关键词并阻止返回给客户?


