• Node.js 中解析 HTML 的方法介绍


    Web 开发中,解析 HTML 是一个常见的任务,特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。

    基本概念

    HTML 解析是指将 HTML 文本转换为可操作的数据结构,通常是 DOM(文档对象模型)。DOM 是一个树状结构,表示了网页的结构和内容,允许我们使用 JavaScript 操作和修改网页。

    常用的 HTML 解析方法

    以下是在 Node.js 中常用的几种 HTML 解析方法:

    1.Cheerio:Cheerio 是一个类似于 jQuery 的库,它可以在服务器端使用 CSS 选择器来解析 HTML 并操作 DOM。它适用于解析静态 HTML 页面。

    2.jsdom:jsdom 是一个在 Node.js 中模拟 DOM 环境的库。它能够解析和操作 HTML,同时还支持模拟浏览器环境中的许多特性,如事件处理和异步请求。

    3.htmlparser2:htmlparser2 是一个快速的 HTML 解析器,它能够将 HTML 文档解析成 DOM 节点流。它通常用于处理大型 HTML 文档或流式数据。

    实践案例:使用 Cheerio 解析 HTML

    以下是一个使用 Cheerio 解析 HTML 的实际案例,其中包含基本的路由与请求处理。确保你的开发环境中已经安装了 Node.js 和 npm。

    1、首先,创建一个新的文件夹,并在该文件夹中运行以下命令初始化项目:

    npm init -y
    

    2、安装所需的依赖库:

    npm install express cheerio axios
    

    3、创建一个名为 index.js 的文件,然后编写以下代码:

    1. const express = require('express');
    2. const axios = require('axios');
    3. const cheerio = require('cheerio'); // 引入 cheerio 库,用于解析 HTML
    4. const app = express();
    5. const PORT = 3000;
    6. app.get('/', async (req, res) => {
    7. try {
    8. // 使用 Axios 发起 GET 请求获取网页的 HTML 内容
    9. const response = await axios.get('https://apifox.com/blog/mock-manual/'); // 替换为你想要解析的网页 URL
    10. const html = response.data; // 获取响应中的 HTML 内容
    11. const $ = cheerio.load(html); // 将 HTML 文本传递给 cheerio,创建一个类似于 jQuery 的对象
    12. // 使用 cheerio 对象的选择器来获取网页标题,并提取文本内容
    13. const title = $('title').text();
    14. res.send(`Title: ${title}`); // 将标题作为响应发送给客户端
    15. } catch (error) {
    16. console.error(error);
    17. res.status(500).send('An error occurred'); // 发生错误时发送错误响应
    18. }
    19. });
    20. app.listen(PORT, () => {
    21. console.log(`Server is running on port ${PORT}`); // 启动服务器并监听指定端口
    22. });

    在上述代码中,注释解释了每个关键步骤的作用:

    • 通过 axios.get() 发起 GET 请求,获取网页的 HTML 内容。
    • 使用 Cheerio 的 $ = cheerio.load(html) 创建了一个可用于选择 DOM 元素的 Cheerio 对象。
    • 通过 $() 使用类似于 jQuery 的选择器,获取 </code> 元素的文本内容。</li><li>最后,将提取的标题作为响应发送给客户端。在这个案例中,我们使用 Express 来创建一个简单的服务器,当访问根路由时,我们使用 <strong><a href="https://apifox.com/apiskills/axios-request-library/" rel="nofollow" title="Axios">Axios</a></strong> 获取网页的 HTML 内容,然后使用 Cheerio 解析并提取网页标题。在浏览器或 API 工具中访问 <code>http://localhost:3000/</code>,你将看到响应。</li></ul> <p></p> <p class="img-center"><img alt="" height="249" src="https://1000bd.com/contentImg/2024/03/25/52a4fc89ac22fabe.png" ></p> <h3><a name="t3"></a>提示、技巧与注意事项</h3> <ul><li>在使用 Cheerio、jsdom 或 htmlparser2 时,务必了解它们的文档和用法,以充分利用其功能。</li><li>当解析复杂的动态页面时,考虑使用模拟浏览器行为的库,如 Puppeteer。</li></ul> <h3><a name="t4"></a>使用接口工具调试后端接口</h3> <p>以 <strong><a href="http://apifox.com/?utm_source=opr&utm_medium=liam" rel="nofollow" title="Apifox">Apifox</a></strong> 为例,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 <strong><a href="https://apifox.com/help/applications-and-plugins/idea/start" rel="nofollow" title="IDEA 插件">IDEA 插件</a></strong>。在后端人员写完服务接口时,测试阶段可以通过 Apifox 来校验接口的正确性,图形化界面极大的方便了项目的上线效率。</p> <p>在本文的例子中,就可以通过 Apifox 来测试接口。新建一个项目后,在项目中选择 <strong>“调试模式”</strong> ,填写请求地址后即可快速发送请求,并获得响应结果,上文的实践案例如图所示:</p> <p></p> <p class="img-center"><img alt="" height="1110" src="https://1000bd.com/contentImg/2024/03/25/ad14890af1814552.png" ></p> <h3><a name="t5"></a>总结</h3> <p>Node.js 提供了多种方法来解析 HTML,包括 Cheerio、jsdom 和 htmlparser2。选择适合你需求的库,可以轻松地操作和提取网页内容。</p> <p><em><strong>知识扩展:</strong></em></p> <ul><li><em><strong><a href="https://apifox.com/apiskills/nodejs-copy-files/" rel="nofollow" title="Node.js 中怎么拷贝文件?nodejs 拷贝文件的方法">Node.js 中怎么拷贝文件?nodejs 拷贝文件的方法</a></strong></em></li><li><strong><a href="https://apifox.com/apiskills/java-springboot-online/" rel="nofollow" title="如何在线建一个 JAVA 的 Spring Boot 项目?Spring Boot 快速入门 Helloworld 示例">如何在线建一个 JAVA 的 Spring Boot 项目?Spring Boot 快速入门 Helloworld 示例</a></strong></li></ul> <p><em><strong>参考链接:</strong></em></p> <ul><li><em>Cheerio 官方文档:<a href="https://cheerio.js.org/" rel="nofollow" title="The industry standard for working with HTML in JavaScript | cheerio">The industry standard for working with HTML in JavaScript | cheerio</a></em></li><li><em>jsdom GitHub 仓库:<a href="https://github.com/jsdom/jsdom" title="https://github.com/jsdom/jsdom">https://github.com/jsdom/jsdom</a></em></li><li><em>htmlparser2 GitHub 仓库:<a href="https://github.com/fb55/htmlparser2" title="GitHub - fb55/htmlparser2: The fast & forgiving HTML and XML parser">GitHub - fb55/htmlparser2: The fast & forgiving HTML and XML parser</a></em></li></ul> </div> </div> </li> <li class="list-group-item ul-li"> <b>相关阅读:</b><br> <nobr> <a href="/Article/Index/851020">Shiro学习笔记_02:shiro的认证+shiro的授权</a> <br /> <a href="/Article/Index/1009395">一般PMP证书会被认为是比较可靠的认证吗?Hr怎么看待?</a> <br /> <a href="/Article/Index/666920">Fiddler Everywhere 3.2.1 Crack</a> <br /> <a href="/Article/Index/1351762">SQLite数据库</a> <br /> <a href="/Article/Index/1685077">Python 学习 第二册 第11章 文件</a> <br /> <a href="/Article/Index/1062712">最详细、最全面的【Java日志框架】介绍,建议收藏,包含JUL、log4j、logback、log4j2等所有主流框架</a> <br /> <a href="/Article/Index/1408148">如何将html转化为pdf</a> <br /> <a href="/Article/Index/787853">Vue2父传子、子传父和兄弟间互传</a> <br /> <a href="/Article/Index/1311081">Ubuntu 基础配置</a> <br /> <a href="/Article/Index/1177691">删除最近7天没有访问的文件</a> <br /> </nobr> </li> <li class="list-group-item from-a mb-2"> 原文地址:https://blog.csdn.net/LiamHong_/article/details/134202208 </li> </ul> </div> <div class="col-lg-4 col-sm-12"> <ul class="list-group" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 最新文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/1484446">攻防演习之三天拿下官网站群</a> <br /> <a href="/Article/Index/1515268">数据安全治理学习——前期安全规划和安全管理体系建设</a> <br /> <a href="/Article/Index/1759065">企业安全 | 企业内一次钓鱼演练准备过程</a> <br /> <a href="/Article/Index/1485036">内网渗透测试 | Kerberos协议及其部分攻击手法</a> <br /> <a href="/Article/Index/1877332">0day的产生 | 不懂代码的"代码审计"</a> <br /> <a href="/Article/Index/1887576">安装scrcpy-client模块av模块异常,环境问题解决方案</a> <br /> <a href="/Article/Index/1887578">leetcode hot100【LeetCode 279. 完全平方数】java实现</a> <br /> <a href="/Article/Index/1887512">OpenWrt下安装Mosquitto</a> <br /> <a href="/Article/Index/1887520">AnatoMask论文汇总</a> <br /> <a href="/Article/Index/1887496">【AI日记】24.11.01 LangChain、openai api和github copilot</a> <br /> </nobr> </li> </ul> <ul class="list-group pt-2" style="word-break:break-all;"> <li class="list-group-item ul-li-bg" aria-current="true"> 热门文章 </li> <li class="list-group-item ul-li"> <nobr> <a href="/Article/Index/888177">十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!</a> <br /> <a href="/Article/Index/797680">奉劝各位学弟学妹们,该打造你的技术影响力了!</a> <br /> <a href="/Article/Index/888183">五年了,我在 CSDN 的两个一百万。</a> <br /> <a href="/Article/Index/888179">Java俄罗斯方块,老程序员花了一个周末,连接中学年代!</a> <br /> <a href="/Article/Index/797730">面试官都震惊,你这网络基础可以啊!</a> <br /> <a href="/Article/Index/797725">你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法</a> <br /> <a href="/Article/Index/797702">心情不好的时候,用 Python 画棵樱花树送给自己吧</a> <br /> <a href="/Article/Index/797709">通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!</a> <br /> <a href="/Article/Index/797716">13 万字 C 语言从入门到精通保姆级教程2021 年版</a> <br /> <a href="/Article/Index/888192">10行代码集2000张美女图,Python爬虫120例,再上征途</a> <br /> </nobr> </li> </ul> </div> </div> </div> <!-- 主体 --> <!--body结束--> <!--这里是footer模板--> <!--footer--> <nav class="navbar navbar-inverse navbar-fixed-bottom"> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="text-muted center foot-height"> Copyright © 2022 侵权请联系<a href="mailto:2656653265@qq.com">2656653265@qq.com</a>    <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备2022015340号-1</a> </div> <div style="width:300px;margin:0 auto; padding:0px 5px;"> <a href="/regex.html">正则表达式工具</a> <a href="/cron.html">cron表达式工具</a> <a href="/pwdcreator.html">密码生成工具</a> </div> <div style="width:300px;margin:0 auto; padding:5px 0;"> <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502049817" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;"> <img src="" style="float:left;" /><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">京公网安备 11010502049817号</p></a> </div> </div> </div> </div> </nav> <!--footer--> <!--footer模板结束--> <script src="/js/plugins/jquery/jquery.js"></script> <script src="/js/bootstrap.min.js"></script> <!--这里是scripts模板--> <!--scripts模板结束--> </body> </html>