文章目录

  • Intro
  • QA
  • DOMParser 在 console 的使用
  • cheerio 在 node 项目中的使用
  • Reference
  • 测试
  • sum

Intro

有一天我在写爬虫。
其实也说不上是爬虫,就是打开浏览器上网,觉得页面有些数据挺有意思,就打开开发者工具,在 Network/Console 中通过 javascript 原生的 fetch 方法 批量、自动地请求一些web资源。

其中有一个关节,是以下的需求:
有一些字符串格式的HTML源码,需要将其转换为 document 对象(DOM对象),
这样我就可以在 console 直接使用选择器(selector)对该HTML文档的文本内容进行过滤清洗处理。

QA

问题来了,如何将 字符串格式的HTML源码 转化为 document类型的DOM对象
答案分两种情况:

  1. cheerio - 在 node 编程环境(需要有相关的类库支持)
  2. 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对象相关推荐

  1. java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈 ...

  2. java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计计算机类专业考研交流学习平台MyBatis+系统+LW文档+源码+调试部署 本源 ...

  3. java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署

    java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java计算机类在线学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈 ...

  4. html格式图片可以转换成word文档,html网页转换成word文档,转换成功,并且可以保存图片,但是总是为web版式的格式,怎么改成“页面”格式,多谢...

    当前位置:我的异常网» C# » html网页转换成word文档,转换成功,并且可以保存图 html网页转换成word文档,转换成功,并且可以保存图片,但是总是为"web版式"的格 ...

  5. JavaScript实现levenshteinDistance字符串编辑距离算法(附完整源码)

    JavaScript实现levenshteinDistance字符串编辑距离算法(附完整源码) levenshteinDistance.js完整源代码 # levenshteinDistance.te ...

  6. springboot结合Freemarker模板生成docx格式的word文档(附代码)

    首先参考的是这篇文章: java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园参考:https://my.oschina.net/u/3737136/blo ...

  7. python实现word文档批量转成自定义格式的excel文档

    python实现word转成自定义格式的excel文档(解决思路和代码) 支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符 最近在开发一个答题类的小程序,到了录入试题进行测试 ...

  8. html版api文档,将html版API文档转换成chm格式的API文档

    将html版API文档转换成chm格式的API文档并不是一件难事,所需要的只是2个工具及其你要制作的API的javadoc文档,一般去官网下载的话,都会有源代码和javadoc,软件一个是制作chm文 ...

  9. 原生前端实现响应式个人简历网站设计(附源码)

    目录 网站站点 所用技术 实现功能 视频展示 源码 网站站点 胜烨的个人网站 所用技术 HTML css JavaScript 实现功能 响应式界面设计 捕捉用户操作 明暗模式 服务器部署 视频展示 ...

最新文章

  1. c语言答案填空选择,C语言试题配答案
  2. LeetCode 1522. Diameter of N-Ary Tree(递归)
  3. 程序员 挣钱比健康重要
  4. 1.Spring框架入门
  5. 话单数据仓库搭建(2)- 数据仓库ODS及DWD层
  6. SPSS25安装教程
  7. FPGA入门实验试验报告
  8. 从一个骗人的技术说起光线追踪——光影技术的里程碑
  9. 中文版ASAM OpenSCENARIO 1.0标准解读
  10. QPainter、QPen、QBrush,绘图、填充、渐变等使用方法
  11. 练习6-3 英文字母替换加密(大小写转换+后移1位) (15 分)
  12. 关于dvb 基本知识
  13. 正则表达式高级技巧背后的关键概念[SM]
  14. 前端实现轮播图的三种方法。
  15. linux-pam 编译,PAM后门编译安装
  16. 如何使用python编程抢京东优惠券 知乎_小猿圈Python之实现京东秒杀功能代码
  17. vue echarts 实现地图大气泡图
  18. JavaWeb 图书管理系统(数据库综合实验)
  19. Makefile中指定目标(MAKECMDGOALS)
  20. CSR BC57E687B蓝牙模块方案 现货供应

热门文章

  1. 服务器显示测试模式,服务器未开启测试功能怎么办 | 手游网游页游攻略大全
  2. PHP - ChatGpt 学习 仅供参考
  3. co.,ltd(Co.,Ltd)是什么意思
  4. java是什么?java能用来干嘛?
  5. 提升智能工业领域人才就业率,维视智造开启产学研融合新航道
  6. 不同系统之间数据对接方式
  7. 关于android开发中startActivityForResult废弃的替换方法调用
  8. 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
  9. CentOS——nfs服务
  10. android工程换背景图片,Android初学者:用知乎Matisse开源项目制作更换应用背景图片功能...