使用 cheerio 在 Node.js 里解析 html 文件

构建客
• 阅读 118

为了解决你提出的问题,我们将使用 Node.js 创建一个应用程序,来读取本地 HTML 文件,并提取其中包含 class="tzxq"<table> 元素的全部内容。下面将详细介绍实现的每一步。

环境搭建与前期准备

我们首先需要确保你的开发环境中已经安装了 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,能让你在服务器端运行 JavaScript。你可以从 Node.js 官网 下载并安装最新版本。

创建项目与安装依赖

接下来,我们需要创建一个新的项目文件夹,并在其中初始化一个新的 Node.js 项目。打开你的终端或命令提示符,执行以下命令:

mkdir my-node-project
cd my-node-project
npm init -y

这些命令创建了一个新的文件夹并初始化了项目。npm init -y 命令自动生成了一个 package.json 文件,它将存储项目的依赖信息和其他配置。

为了解析 HTML 文件,我们将使用 cheerio 库,它是一个快速、灵活且简便的实现了核心 jQuery 功能的库。使用以下命令安装:

npm install cheerio

读取和处理 HTML 文件

首先,你需要确保 HTML 文件已经在你的项目文件夹中。假设该文件名为 example.html。我们的任务是读取这个文件,并使用 cheerio 来提取特定的 <table> 元素。

创建一个名为 extractTables.js 的新文件,并开始编写代码:

const fs = require('fs');
const cheerio = require('cheerio');

// 读取 HTML 文件
fs.readFile('example.html', 'utf8', (err, html) => {
  if (err) {
    console.error(`读取文件时发生错误: ${err}`);
    return;
  }

  // 使用 cheerio 加载 HTML
  const $ = cheerio.load(html);

  // 查找所有 class 中包含 `tzxq` 的 table 元素
  $('table').each(function() {
    if ($(this).attr('class').includes('tzxq')) {
      console.log(`找到的表格内容如下:`);
      console.log($(this).html());
    }
  });
});

代码解释

  • 文件读取:我们使用 Node.js 的 fs 模块来异步读取本地的 HTML 文件。如果读取成功,内容将存储在 html 变量中。
  • HTML 处理:加载读取的 HTML 内容到 cheerio,提供了一个类似于 jQuery 的 API,可以方便地操作 HTML 元素。
  • 元素提取$('table') 选择器获取所有的 <table> 元素,each 函数遍历它们。对于每一个 <table> 元素,我们检查其 class 属性是否包含 tzxq 字符串。如果是,就打印出该 <table> 元素的内部 HTML。

测试与验证

为了确保一切正常,你可以创建一个包含符合条件(即包含 class="tzxq"<table> 元素)的 example.html 文件。运行 node extractTables.js,如果一切顺利,你将在控制台看到被提取的 <table> 元素的 HTML 内容。

后续可能的改进

代码中我们仅考虑了 class 属性直接包含 tzxq 的情况。在实际应用中,class 可能包含多个值,如 class="some tzxq other"。当前的代码已经能够处理这种情况,但如果有更复杂的需求(例如,需要处理嵌套的 <table> 或需要从表格中进一步提取数据),则可能需要扩展此脚本的功能或使用更复杂的选择器。

结论

通过上述步骤,我们不仅学会了如何设置一个基本的 Node.js 项目和处理 HTML 文件,还探索了使用 cheerio 进行 DOM 操作的基本方法。这些技能是开发现代 web 应用的重要基础,尤其是在处理 web 数据抓取或内容管理系统时尤为重要。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
小嫌 小嫌
3年前
Node.js学习笔记
什么是Node.js文件?Node.js文件包含将在特定事件上执行的任务一个典型的事件是有人试图访问服务器上的端口Node.js文件必须在服务器上启动才能生效Node.js文件的扩展名为“.js”Node.js文件应当如何执行推荐使用各种类型的编译器生成一个空白的nodedemo.js文件,在文件中输入下面的内容:varhttprequi
芝士年糕 芝士年糕
2年前
docker 中安装 MySQL 以及使用
环境:我使用3A服务器搭建centos7简介这里的实现思路是,先拉取完MySQL镜像之后,启动MySQL容器,然后将MySQL的配置文件拉取到本地,关闭之前启动的容器,重新使用挂载的方式启动。第一步:拉取mysql镜像dockerpullmysql第二步:在本地创建用于挂载的目录这里是用来在本地创建一个conf文件,以后启动 do
Stella981 Stella981
3年前
Node.js实现WebSocket聊天室的例子
对于聊天室,大家应该都不陌生,笔者也写过很多关于聊天室的例子。本节,我们将演示如何通过Node.js来实现一个WebSocket聊天服务器的例子。使用ws创建WebSokcet服务器Node.js原生API并未提供WebSocket的支持,因此,需要安装第三方包才能使用WebSocket功能。对于WebSoc
Stella981 Stella981
3年前
Node.js 中使用 ECDSA 签名遇到的坑
文/Fenying最近有个朋友问我关于Node.js下使用ECDSA的问题,主要是使用Node.js的Crypto模块无法校验网络传输过来的签名结果。在踩坑无数后,终于搞清楚了原因。坑0x00:签名输出格式在排除了证书、消息不一致的可能之后,我开始对比使用Node.js签名的结果与网络传输过来的签
小万哥 小万哥
1年前
Python 模块:创建、导入和使用
什么是模块?将模块视为代码库。模块是一个包含一组函数的文件,您想要在应用程序中包含这些函数。创建一个模块要创建一个模块,只需将要包含在其中的代码保存在扩展名为.py的文件中:示例:将以下代码保存在名为的文件中:pythondefgreeting(name)
liam liam
1年前
Node.js 中解析 HTML 的最佳实践
在Web开发中,解析HTML是一个常见的任务,特别是当我们需要从网页中提取数据或操作DOM时。掌握中解析HTML的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在Node.js中解析HTML。基本概念HTML解析是指将HTML文本转换为
python HTML文件标题解析问题的挑战
引言在网络爬虫中,HTML文件标题解析扮演着至关重要的角色。正确地解析HTML文件标题可以帮助爬虫准确地获取所需信息,但是在实际操作中,我们常常会面临一些挑战和问题。本文将探讨在Scrapy中解析HTML文件标题时可能遇到的问题,并提供解决方案。问题背景在
liam liam
1年前
学会如何在 JavaScript 中快速读取文件
假设您需要使用在服务器上读取多个文件。Node.js这样的运行时环境中有许多读取文件的方法。哪一种最好?让我们来考虑各种方法。使用fs.promisesconstfsrequire('fs/promises');constreadFilefs.readFi
liam liam
1年前
Node.js实现文件夹遍历的常用方法
在开发中,经常需要对文件系统进行操作,包括遍历文件夹以获取文件列表。本文将讨论使用Node.js遍历文件夹的几种常用方法,并通过一个实际案例来演示如何实现。基本概念在开始之前,让我们了解一些基本的概念:文件系统模块(fs模块):Node.js提供了内置的f