如何在Rapid 7 Nexpose SQL查询中去除XHTML标签提取纯文本
解决方案
你遇到的问题是Nexpose内置的htmlToText函数对带XML命名空间的规范XHTML解析支持不足,无法完全剥离标签和命名空间属性,可以用以下两种方案解决:
方案1:直接在Nexpose SQL中处理(推荐)
Nexpose底层基于PostgreSQL数据库,原生支持XML解析操作,你可以利用XPath直接提取所有文本节点,完全剥离所有标签和属性:
SELECT dp.policy_id, dp.title as policy_title, dpr.rule_id, dpr.title as policy_rule_title, dp.benchmark_name, da.ip_address, da.host_name, dpr.description, dp.category, fapr.date_tested, htmlToText(fapr.proof) as proof, fapr.compliance, dpr.severity, -- 处理rationale字段 regexp_replace( array_to_string( xpath('//text()', unescape_html(dpr.rationale)::xml, array[array['xhtml', 'http://www.w3.org/1999/xhtml']] )::text[], ' ' ), '\s+', ' ', 'g' ) as rationale, -- 处理remediation字段,逻辑和rationale一致 regexp_replace( array_to_string( xpath('//text()', unescape_html(dpr.remediation)::xml, array[array['xhtml', 'http://www.w3.org/1999/xhtml']] )::text[], ' ' ), '\s+', ' ', 'g' ) as remediation FROM fact_asset_policy_rule fapr JOIN dim_policy dp on dp.policy_id = fapr.policy_id JOIN dim_policy_rule dpr on dpr.policy_id = fapr.policy_id and fapr.rule_id = dpr.rule_id JOIN dim_asset da on da.asset_id = fapr.asset_id WHERE fapr.compliance = false order by dp.title, dpr.title
代码说明:
unescape_html:先把字段里的<这类HTML实体转义符还原为正常标签::xml:把字符串转换为XML类型用于解析xpath('//text()', ...):提取XML中所有的文本节点,自动忽略所有标签和属性array_to_string:把提取到的多个文本节点拼接为一个字符串regexp_replace:把多个连续空格、换行统一替换为单个空格,保证格式整洁
如果你的Nexpose版本不支持unescape_html,可以去掉这个函数调用,直接把字段转XML类型即可。
方案2:导出后用Python脚本批量处理
如果你不想修改SQL查询,也可以导出数据后用Python批量清理标签,示例代码如下:
from lxml import etree import re def clean_xhtml(content): # 先还原HTML实体 content = content.replace('<', '<').replace('>', '>').replace('"', '"').replace('&', '&') try: # 解析XML提取所有文本 tree = etree.fromstring(content.encode('utf-8')) text_list = tree.xpath('//text()') clean_text = ' '.join([t.strip() for t in text_list if t.strip()]) # 清理多余空白 return re.sub(r'\s+', ' ', clean_text) except: # 解析失败时直接用正则暴力清理标签 return re.sub(r'<[^>]+>', '', content)
两种方案都可以完全实现你需要的纯文本提取效果,不会残留任何XHTML标签和命名空间属性。
内容的提问来源于stack exchange,提问作者user2821552
相关产品推荐
相关产品推荐

