在前端浏览器中,如果需要直接解析 HTML 并获取 原始未标准化 的 URL 属性值(如 href
、src
、action
),可以使用以下库或方法:
1. 使用 htmlparser2
(纯解析,不触发 DOM 标准化)
适用场景:需要轻量级、快速的 HTML 解析,避免浏览器自动补全 URL。
安装:
npm install htmlparser2
示例代码:
import { Parser } from 'htmlparser2';
const html = `
<a href="/path?query=1">Link</a>
<img src="image.png">
`;
const attributes = [];
const parser = new Parser({
onopentag(name, attrs) {
if (attrs.href) attributes.push({ tag: name, attr: 'href', value: attrs.href });
if (attrs.src) attributes.push({ tag: name, attr: 'src', value: attrs.src });
}
});
parser.write(html);
parser.end();
console.log(attributes); // 输出原始属性值
优点:
- 不依赖浏览器 DOM,直接解析原始文本。
- 保留原始值(如相对路径、未编码的查询参数)。
2. 使用 cheerio
(类似 jQuery 的服务器端 DOM 操作)
适用场景:需要类似 jQuery 的 API,同时避免 URL 标准化。
安装:
npm install cheerio
示例代码:
import * as cheerio from 'cheerio';
const html = `
<a href="/path?query=1">Link</a>
<img src="image.png">
`;
const $ = cheerio.load(html);
const elements = $('[href], [src]').map((_, el) => {
const $el = $(el);
return {
tag: el.tagName,
attr: $el.attr('href') ? 'href' : 'src',
value: $el.attr('href') || $el.attr('src')
};
}).get();
console.log(elements); // 输出原始属性值
优点:
- 兼容 jQuery API,易上手。
- 默认返回原始属性值(除非手动调用
new URL()
)。
3. 原生方案:正则表达式 + DOMParser
如果不想引入第三方库,可以结合正则表达式和 DOMParser
(参考之前回答的方法2):
function getRawAttributes(html) {
const doc = new DOMParser().parseFromString(html, 'text/html');
const elements = [...doc.querySelectorAll('[href], [src]')];
return elements.map(el => {
const outerHTML = el.outerHTML;
const attrName = el.hasAttribute('href') ? 'href' : 'src';
const rawValue = outerHTML.match(new RegExp(`${attrName}=["']([^"']*)["']`, 'i'))?.[1];
return { tag: el.tagName, attr: attrName, value: rawValue };
});
}
关键区别总结
方案 | 是否标准化 URL | 依赖环境 | 适用场景 |
---|---|---|---|
htmlparser2 |
❌ 保留原始值 | Node.js/浏览器 | 需要最高性能的底层解析 |
cheerio |
❌ 保留原始值 | Node.js/浏览器 | jQuery-like API + HTML5标准 |
DOMParser+正则 |
❌ (需额外处理) | 仅浏览器 | 无依赖的原生方案 |
注意事项
- 编码问题:
htmlparser2
/cheerio
返回的值可能是编码后的(如&→&
)),需手动解码:const decodedValue = new DOMParser().parseFromString(value, 'text/html').body.textContent;
- XSS防护:
- 如果解析用户输入的 HTML,确保对结果进行消毒(如使用
DOMPurify
)。
- 如果解析用户输入的 HTML,确保对结果进行消毒(如使用
根据你的需求选择最适合的方案!
内容由零声教学AI助手提供,问题来源于学员提问