悠悠楠杉
网站页面
正文:
在Web开发中,处理第三方API返回的HTML字符串是常见需求。例如,从富文本中提取纯正文、过滤广告标签或抓取特定元信息。本文将分步骤演示如何用原生JavaScript和React实现高效解析。
浏览器内置的DOMParser能将字符串转换为可操作的DOM树:
const extractContent = (htmlString, targetTag) => {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, 'text/html');
return Array.from(doc.querySelectorAll(targetTag))
.map(el => el.innerHTML)
.join('');
};
// 示例:提取所有<p>标签
const html = '<div><p>第一段</p><span>广告</span><p>第二段</p></div>';
console.log(extractContent(html, 'p')); // 输出:"第一段第二段"
关键点:
1. 通过querySelectorAll精准定位标签
2. 使用Array.from将NodeList转为数组
3. 处理XSS风险:建议后续使用DOMPurify sanitize内容
在React中直接使用dangerouslySetInnerHTML可能引发安全问题,推荐结合useMemo优化性能:
import { useMemo } from 'react';
const SafeHtmlRenderer = ({ html, allowedTags }) => {
const cleanContent = useMemo(() => {
const div = document.createElement('div');
div.innerHTML = html;
allowedTags.forEach(tag => {
if (!div.querySelector(tag)) return;
// 保留允许的标签,移除其他内容
});
return div.innerHTML;
}, [html, allowedTags]);
return <div dangerouslySetInnerHTML={{ __html: cleanContent }} />;
};
有时需提取带特定属性的内容,如<div class="article">:
const extractByAttribute = (html, attr, value) => {
const doc = new DOMParser().parseFromString(html, 'text/html');
return doc.querySelector(`[${attr}="${value}"]`)?.innerHTML || '';
};
性能提示:频繁解析大体积HTML时,考虑:
1. 使用TreeWalker替代querySelector
2. 在Web Worker中执行耗时操作
通过组合这些技术,可以构建出灵活性强、安全性高的内容提取管道,适应从简单博客到复杂CMS系统的各种场景。