You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现)解析,代码可维护性更高:

  1. 先安装依赖:npm install cheerio
  2. 代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:18:02