javascript 原生类 DOMParser 把 字符串格式的HTML文档源码 转换成 document DOM对象
文章目录
- Intro
- QA
- DOMParser 在 console 的使用
- cheerio 在 node 项目中的使用
- Reference
- 测试
- sum
Intro
有一天我在写爬虫。
其实也说不上是爬虫,就是打开浏览器上网,觉得页面有些数据挺有意思,就打开开发者工具,在 Network/Console 中通过 javascript 原生的 fetch 方法 批量、自动地请求一些web资源。
其中有一个关节,是以下的需求:
有一些字符串格式的HTML源码,需要将其转换为 document 对象(DOM对象),
这样我就可以在 console 直接使用选择器(selector)对该HTML文档的文本内容进行过滤清洗处理。
QA
问题来了,如何将 字符串格式的HTML源码
转化为 document类型的DOM对象
?
答案分两种情况:
cheerio
- 在 node 编程环境(需要有相关的类库支持)DOMParser
在浏览器控制台(需要有原生 javascript 的 API 支持)
DOMParser 在 console 的使用
MDN DOMParser
https://developer.mozilla.org/zh-CN/docs/Web/API/DOMParser
var stringContainingXMLSource = `<!DOCTYPE html> <html lang="en"> <head> <title>wuyujin1997</title> </head> <body> <div id="wyj"> <h2><a href="https://wuyujin.blog.csdn.net/">wuyujin1997 DOMParser demo</a></h2> </div> </body> </html>`;var parser = new DOMParser();
var doc = parser.parseFromString(stringContainingXMLSource, "text/html");// 这个 doc 对象就是整个HTML文档的 DOM对象
console.log("type: ", Object.prototype.toString.call(doc));
console.log(doc);// document 的 DOM对象 可以开始调用原生API通过选择器对子节点进行操作了。
console.log(doc.querySelector("div#wyj"));
console.log(doc.getElementById("wyj"));
这个 DOMParser 不止可以解析 html,也可以解析 xml。
不同类型下的 mimeType 见下表:
"mimeType"
"text/html"
"text/xml"
"application/xml"
"application/xhtml+xml"
"image/svg+xml"
cheerio 在 node 项目中的使用
https://cheerio.js.org/
https://www.npmjs.com/package/cheerio
var cheerio = require("cheerio");
var htmlSourceString = `<!DOCTYPE html> <html lang="en"> <head> <title>wuyujin1997</title> </head> <body> <div id="wyj"> <h2><a href="https://wuyujin.blog.csdn.net/">wuyujin1997 DOMParser demo</a></h2> </div> </body> </html>`;var cheerioOptions = {xml: {withDomLvl1: true,normalizeWhitespace: false,xmlMode: true,decodeEntities: true,},
};const $ = cheerio.load(htmlSourceString, cheerioOptions);
console.log($.html());
console.log($.text());var myDiv = $("div#wyj");
// 用选择器获取的DOM节点对象 也可以调用 .html() .text()
Reference
- MDN fetch
- MDN XMLSerializer
DOMParser 是从字符串格式的HTML源码中解析出一个document类型的DOM对象。
而 XMLSerializer 的作用则正好相反。
当然,有了document 或其他DOM节点,想获取内容,还有 innerText innerHTML outerText outerHTML 等dom对象的成员属性可以使用。
innerHTML, innerText, outerHTML, outerText的区别
- 邱仲麟 明代北京的瘟疫与帝国医疗体系的应变
- 99藏书网 夜谭十记
这个网站对于 network response 中的HTML源码做了一些DOM节点顺序
的技术处理。
测试
邱仲麟 明代北京的瘟疫与帝国医疗体系的应变 https://www.docin.com/p-1077305105.html
打开 F12 Network,然后把网页下拉,可以看到新发送的网络请求:
这样的请求共有58个(就是网页里的页码,上图中可以看到),每个请求就是一张图片:
/*** https://www.docin.com/p-1077305105.html* 邱仲麟 《明代北京的瘟疫与帝国医疗体系的应变》*/function saveStringToFile(filename, blobFile) {// 创建一个 <a> 标签对象var linkTag = window.document.createElement("a");// 设置该实例的 download 和 href 属性(HTML 5 标准属性)linkTag.download = filename;linkTag.href = window.URL.createObjectURL(blobFile);// 把刚才手动创建的 <a> 添加到 DOM 文档中window.document.body.appendChild(linkTag);linkTag.click(); // 调用点击事件// 移除刚才添加的子标签window.document.body.removeChild(linkTag);
}function downloadIt(fileName, url) {fetch(url, {"headers": {"accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","accept-language": "en-US,en;q=0.9","cache-control": "no-cache","pragma": "no-cache","sec-ch-ua": "\"Chromium\";v=\"106\", \"Google Chrome\";v=\"106\", \"Not;A=Brand\";v=\"99\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","sec-fetch-dest": "image","sec-fetch-mode": "no-cors","sec-fetch-site": "same-site"},"referrer": "https://www.docin.com/p-1077305105.html","referrerPolicy": "no-referrer-when-downgrade","body": null,"method": "GET","mode": "cors","credentials": "include"}).then(resp => {return resp.blob();}).then(data => {saveStringToFile(fileName, data);})
}// `https://docimg1.docin.com/docinpic.jsp?file=1077305105&width=892&sid=Sr8*1MVeKYpaCGIMdVwE4mJP4SZgGRO48trgKBhSIIJUUt34nLfam19mfrHxffcH&pageno=19&pcimg=1`;
// `https://docimg1.docin.com/docinpic.jsp?file=1077305105&width=892&sid=Sr8*1MVeKYpaCGIMdVwE4mJP4SZgGRO48trgKBhSIIJUUt34nLfam19mfrHxffcH&pageno=${pageno}&pcimg=1`;for (var i = 1; i <= 58; i++) {var pageno = i;// 这个URL需要随时替换。因为 session 会失效。var url = `https://docimg1.docin.com/docinpic.jsp?file=1077305105&width=892&sid=Sr8*1MVeKYpaCGIMdVwE4mJP4SZgGRO48trgKBhSIIJUUt34nLfam19mfrHxffcH&pageno=${pageno}&pcimg=1`;downloadIt(pageno + ".png", url);
}
结果:
如果有法子把多张图片合并成一个pdf文件就好了。
需求: 多张任意格式的图片-->一个pdf文件
。
有很多网站提供这样的服务,但是要么要注册,要么充钱,要么页面有广告病毒,要么你不会用……
有没有办法自己写程序实现以上的需求?
当然可以。
不然别人的网站是拿什么写的?
搜索javascript Blob File
,自己实现。
sum
最后一句话:
javascript+浏览器+网络,已经可以做很多事了。
但是,要正确使用工具。
学习是学习,不要影响他人的利益。
javascript 原生类 DOMParser 把 字符串格式的HTML文档源码 转换成 document DOM对象相关推荐
- java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈 ...
- java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署 本源 ...
- java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈 ...
- html格式图片可以转换成word文档,html网页转换成word文档,转换成功,并且可以保存图片,但是总是为web版式的格式,怎么改成“页面”格式,多谢...
当前位置:我的异常网» C# » html网页转换成word文档,转换成功,并且可以保存图 html网页转换成word文档,转换成功,并且可以保存图片,但是总是为"web版式"的格 ...
- JavaScript实现levenshteinDistance字符串编辑距离算法(附完整源码)
JavaScript实现levenshteinDistance字符串编辑距离算法(附完整源码) levenshteinDistance.js完整源代码 # levenshteinDistance.te ...
- springboot结合Freemarker模板生成docx格式的word文档(附代码)
首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...
- python实现word文档批量转成自定义格式的excel文档
python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试 ...
- html版api文档,将html版API文档转换成chm格式的API文档
将html版API文档转换成chm格式的API文档并不是一件难事,所需要的只是2个工具及其你要制作的API的javadoc文档,一般去官网下载的话,都会有源代码和javadoc,软件一个是制作chm文 ...
- 原生前端实现响应式个人简历网站设计(附源码)
目录 网站站点 所用技术 实现功能 视频展示 源码 网站站点 胜烨的个人网站 所用技术 HTML css JavaScript 实现功能 响应式界面设计 捕捉用户操作 明暗模式 服务器部署 视频展示 ...
最新文章
- c语言答案填空选择,C语言试题配答案
- LeetCode 1522. Diameter of N-Ary Tree(递归)
- 程序员 挣钱比健康重要
- 1.Spring框架入门
- 话单数据仓库搭建(2)- 数据仓库ODS及DWD层
- SPSS25安装教程
- FPGA入门实验试验报告
- 从一个骗人的技术说起光线追踪——光影技术的里程碑
- 中文版ASAM OpenSCENARIO 1.0标准解读
- QPainter、QPen、QBrush,绘图、填充、渐变等使用方法
- 练习6-3 英文字母替换加密(大小写转换+后移1位) (15 分)
- 关于dvb 基本知识
- 正则表达式高级技巧背后的关键概念[SM]
- 前端实现轮播图的三种方法。
- linux-pam 编译,PAM后门编译安装
- 如何使用python编程抢京东优惠券 知乎_小猿圈Python之实现京东秒杀功能代码
- vue echarts 实现地图大气泡图
- JavaWeb 图书管理系统(数据库综合实验)
- Makefile中指定目标(MAKECMDGOALS)
- CSR BC57E687B蓝牙模块方案 现货供应
热门文章
- 服务器显示测试模式,服务器未开启测试功能怎么办 | 手游网游页游攻略大全
- PHP - ChatGpt 学习 仅供参考
- co.,ltd(Co.,Ltd)是什么意思
- java是什么?java能用来干嘛?
- 提升智能工业领域人才就业率,维视智造开启产学研融合新航道
- 不同系统之间数据对接方式
- 关于android开发中startActivityForResult废弃的替换方法调用
- 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
- CentOS——nfs服务
- android工程换背景图片,Android初学者:用知乎Matisse开源项目制作更换应用背景图片功能...