Node.js使用正则从HTML字符串提取数据报错及实现咨询
问题解答
报错原因
- 变量引用错误:你通过
fs.readFile读取到的文件内容存储在回调参数data中,但执行正则匹配时传入了未定义的html变量,首先就会导致匹配失败。 - 正则修饰符缺失:JavaScript正则默认
.不匹配换行符,你的HTML内容中目标标签之间存在大量换行,.*?无法跨行匹配到内容,最终exec返回null,访问null[1]就触发了类型错误。 - 全局匹配逻辑缺失:你需要提取多组Debtor和Secured Party的内容,单次
exec调用仅能返回第一个匹配结果,无法覆盖全部数据。
修复方案
方式1:正则实现(适合当前简单场景)
const fs = require('fs'); fs.readFile('file.txt', 'utf8', function (err, data) { if (err) { console.log("Error reading file.txt", err); process.exit(1); } // 加s修饰符支持跨行匹配,g修饰符全局匹配所有目标内容 const reg = /<td class="(dName|dAddress|spName|spAddress)">(.*?)<\/td>/gs; const result = []; let match; while ((match = reg.exec(data)) !== null) { result.push(match[2]); } // 按要求格式化输出:每4项为一组,组内每2项换行,组之间空行分隔 const output = []; for (let i = 0; i < result.length; i += 4) { output.push(result.slice(i, i+2).join('\n')); output.push(result.slice(i+2, i+4).join('\n')); } console.log(output.join('\n\n')); });
方式2:HTML解析库实现(更稳定,推荐复杂场景使用)
如果后续HTML结构可能发生变化,建议使用cheerio(Node.js环境的轻量jQuery实现)解析,代码可维护性更高:
- 先安装依赖:
npm install cheerio - 代码如下:
const fs = require('fs'); const cheerio = require('cheerio'); fs.readFile('file.txt', 'utf8', function (err, data) { if (err) { console.log("Error reading file.txt", err); process.exit(1); } const $ = cheerio.load(data); const output = []; $('.dName, .dAddress, .spName, .spAddress').each((_, el) => { output.push($(el).text()); }); const formatted = []; for (let i = 0; i < output.length; i +=4) { formatted.push(output.slice(i, i+2).join('\n')); formatted.push(output.slice(i+2, i+4).join('\n')); } console.log(formatted.join('\n\n')); });
两种方案运行后都可以得到你要求的输出格式。
内容的提问来源于stack exchange,提问作者Dev Dev
相关产品推荐
相关产品推荐

