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

如何在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('&lt;', '<').replace('&gt;', '>').replace('&quot;', '"').replace('&amp;', '&')
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:36:02