如何使用Cheerio通过正则表达式匹配模式获取标签属性?
解决Cheerio匹配带数字后缀的属性问题
你的代码有几个关键问题导致无法正常工作,我来一步步帮你修正:
原代码的问题分析
- 正则表达式未正确创建:你用字符串模板生成了
re变量,但没有把它转换成真正的正则表达式对象,而且$(e).attr(/re/)里的/re/是固定字面量,不是引用变量re的正则。 - Cheerio的
attr()方法局限性:即使传对了正则,attr()默认只会返回第一个匹配的属性值,无法获取所有符合模式的属性。
解决方案:遍历所有属性并过滤
我们可以先获取元素的所有属性,再通过正则筛选出符合前缀-数字格式的属性,根据你的需求提供两种实现方式:
方式1:按属性前缀分组为数组(推荐)
把同前缀的属性按数字索引整理成数组,方便后续按顺序访问:
const attribs = ['captionText', 'httpUri']; const tag = {}; // 获取元素的所有属性集合 const elementAttribs = $(e).get(0).attribs; attribs.forEach(attrPrefix => { // 创建正则:匹配以指定前缀开头,后跟"-数字"的属性名 const attrRegex = new RegExp(`^${attrPrefix}-(\\d+)$`); // 遍历所有属性键值对 Object.entries(elementAttribs).forEach(([attrName, attrValue]) => { const matchResult = attrName.match(attrRegex); if (matchResult) { const index = matchResult[1]; // 提取属性名中的数字索引 // 初始化前缀对应的数组(如果不存在) if (!tag[attrPrefix]) { tag[attrPrefix] = []; } // 将值存入对应索引的位置 tag[attrPrefix][index] = attrValue; } }); }); // 最终输出示例: // tag = { // captionText: ['bla bla', 'bada bing bada boom'], // httpUri: ['https://path/to/server0', 'https://path/to/server2'] // }
方式2:保留原始属性名作为键
如果你希望直接保留captionText-0这类完整属性名作为对象的键,可以用下面的代码:
const attribs = ['captionText', 'httpUri']; const tag = {}; const elementAttribs = $(e).get(0).attribs; attribs.forEach(attrPrefix => { const attrRegex = new RegExp(`^${attrPrefix}-\\d+$`); Object.entries(elementAttribs).forEach(([attrName, attrValue]) => { // 检查属性名是否匹配模式 if (attrRegex.test(attrName)) { tag[attrName] = attrValue; } }); }); // 最终输出示例: // tag = { // 'captionText-0': 'bla bla', // 'captionText-1': 'bada bing bada boom', // 'httpUri-0': 'https://path/to/server0', // 'httpUri-1': 'https://path/to/server2' // }
关键说明
$(e).get(0).attribs:Cheerio对象的get(0)方法可以获取对应的原生DOM元素(或Cheerio包装的元素对象),其attribs属性包含了该元素的所有属性键值对。- 正则表达式中的
^和$:确保属性名完全匹配前缀-数字的格式,避免误匹配类似captionText-0-extra这类不符合预期的属性。
内容的提问来源于stack exchange,提问作者punkish
相关产品推荐
相关产品推荐

