一、windows命令行实现chm帮助文件,转换为html文件,方法是:
D:\1>hh -decompile d:\1\html d:\1\AutoIt.chm
需要注意的是 :
d:\1\AutoIt.chm 这是chm绝对路径,必须是绝对路径
hh -decompile 是固定的
d:\1\html 这个目录是html存放的目标目录,必须是绝对路径;
二、html文件已可用,但其中的链接为JS生成,不方便AI处理。使用程序转换为AI容易抓取的html,如下:
private void button34_Click(object sender, EventArgs e) { //使用示例: OpenFileDialog openFileDialog = new OpenFileDialog { Filter = "Html Files|*.htm", Title = "请选择一个Html文件" }; if (openFileDialog.ShowDialog() == DialogResult.OK) { var converter = new HtmlLinkConverter(); // 读取文件内容 string filePath = openFileDialog.FileName; string inputHtml = File.ReadAllText(filePath, Encoding.GetEncoding("GB2312")); string outputHtml = converter.ConvertToStaticLinks(inputHtml); // 保存处理后的内容 SaveFileDialog saveFileDialog = new SaveFileDialog { Filter = "Html Files|*.htm", Title = "保存处理后的文件", FileName = Path.GetFileNameWithoutExtension(filePath) + "_processed.htm" }; if (saveFileDialog.ShowDialog() == DialogResult.OK) { File.WriteAllText(saveFileDialog.FileName, outputHtml, Encoding.UTF8); MessageBox.Show("文件已成功保存!", "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } public class HtmlLinkConverter { public string ConvertToStaticLinks(string htmlContent) { // 提取所有d.add节点 var nodes = ParseDTreeNodes(htmlContent); // 构建树结构 var nodeMap = BuildNodeMap(nodes); // 生成静态HTML列表 var staticContent = GenerateStaticHtml(nodeMap); // 替换原始动态内容 return ReplaceDynamicContent(htmlContent, staticContent); } private List<DTreeNode> ParseDTreeNodes(string html) { var nodes = new List<DTreeNode>(); var regex = new Regex(@"d\.add\((\d+),\s*(-?\d+),\s*""(.*?)"",\s*""(.*?)""\);"); foreach (Match match in regex.Matches(html)) { nodes.Add(new DTreeNode( int.Parse(match.Groups[1].Value), int.Parse(match.Groups[2].Value), match.Groups[3].Value, match.Groups[4].Value )); } return nodes; } private Dictionary<int, List<DTreeNode>> BuildNodeMap(List<DTreeNode> nodes) { var nodeMap = new Dictionary<int, List<DTreeNode>>(); foreach (var node in nodes) { if (!nodeMap.ContainsKey(node.ParentId)) nodeMap[node.ParentId] = new List<DTreeNode>(); nodeMap[node.ParentId].Add(node); } return nodeMap; } private string GenerateStaticHtml(Dictionary<int, List<DTreeNode>> nodeMap) { var sb = new StringBuilder(); sb.AppendLine("<ul>"); GenerateTree(nodeMap, -1, sb, 0); // 从根节点开始(父ID=-1) sb.AppendLine("</ul>"); return sb.ToString(); } private void GenerateTree(Dictionary<int, List<DTreeNode>> nodeMap, int parentId, StringBuilder sb, int level) { if (!nodeMap.ContainsKey(parentId)) return; foreach (var node in nodeMap[parentId]) { var indent = new string(' ', level * 4); sb.Append($"{indent}<li>"); if (!string.IsNullOrEmpty(node.Url)) { sb.Append($"<a href=\"{node.Url}\">{node.Name}</a>"); } else { sb.Append(node.Name); } if (nodeMap.ContainsKey(node.Id)) { sb.AppendLine("\n" + indent + " <ul>"); GenerateTree(nodeMap, node.Id, sb, level + 1); sb.AppendLine(indent + " </ul>"); } sb.AppendLine("</li>"); } } private string ReplaceDynamicContent(string originalHtml, string staticContent) { // 移除所有JavaScript代码 var regex = new Regex( @"<script[^>]*>[\s\S]*?</script>", RegexOptions.Multiline ); var cleanedHtml = regex.Replace(originalHtml, string.Empty); // 替换动态生成部分 var dynamicRegex = new Regex( @"<div class=""dtree"">[\s\S]*?</div>", RegexOptions.Singleline ); return dynamicRegex.Replace(cleanedHtml, staticContent); } } public class DTreeNode { public int Id { get; } public int ParentId { get; } public string Name { get; } public string Url { get; } public DTreeNode(int id, int parentId, string name, string url) { Id = id; ParentId = parentId; Name = name; Url = url; } }
使用上面的程序处理___left.htm文件,主htm文件类似下面并另存为utf-8的格式:
<HTML>
<HEAD>
<meta charset="gb2312">
<TITLE>海南省2023定额章节说明及文件汇编.chm</TITLE>
</HEAD>
<FRAMESET border=4 cols="100%">
<FRAME name=left marginWidth=5 marginHeight=5 src="海南省2023定额章节说明及文件汇编\___left.htm">
</FRAMESET>
</HTML>
因为早期微软的一些原因,CHM的编码并不是统一的,一般中文的是gb2312,实际编码为ansi,需要将___left.htm等文件另存为utf-8编码,并在文件头中加上下面的标识,程序才可以正确识别。
<meta charset="gb2312">
三、替换你不想要的一些版权信息,可以直接替换或使用程序都可。
四、上传上面处理的html文件到网站某个文件夹,包含所有文件及图片等。
五、使用https://calc.xycost.com/Chatgpt/ScrapeWeb.aspx来抓取相应的链接,如果链接含中文,也可用ai来生成列表
六、AI知识库-导入文本数据集-网站链接,粘贴上面生成的链接即可。
七、使用嵌入模型来进行向量化,然后AI就可以使用了。
八、修改\eingeering\html\下的chmviewer.aspx.cs及default.aspx中的相应内容,如下所示,是通过目录下的catalog.txt文件来显示内容的,该文件可通过本人的采集程序生成。
{ "hainan-2025-quota-docs", "海南省2025预算定额章节说明" },
{ "hainan-2023-quota-docs", "海南省2023概算定额章节说明及文件汇编" },
{ "hainan-2017-quota-docs", "海南省2017定额章节说明" }, // Ensure this directory name matches exactly
{ "guangdong-2018-quota-docs", "广东省2018定额章节说明" },
{ "guangxi-2024-quota-docs", "广西清单定额说明及计算规则" }, // Original name was "广西2024定额章节说明及文件汇编" - ensure consistency
{ "jiangsu-2014-quota-docs", "江苏定额说明" },
{ "jiangsu-municipal-2021-quota-docs", "江苏省市政工程消耗量定额(2021年)章节说明" },
{ "zhejiang-2018-quota-docs", "浙江省2018序列定额章节说明" },
{ "zhejiang-policy-docs", "浙江省政策性文件汇总" },
{ "hubei-2024-quota-docs", "湖北2024序列定额章节说明" }, // Original name was "湖北省2024序列定额章节说明"
{ "henan-2016-quota-docs", "河南2016序列定额章节说明" },
{ "beijing-housing-repair-2023-calc-docs", "北京房屋修缮工程工程量计算标准(2023)说明" },
{ "beijing-housing-repair-2021-budget-docs", "北京市房屋修缮工程计价依据预算消耗量标准(2021)" },
{ "beijing-construction-2021-budget-docs", "北京市建设工程计价依据预算消耗量标准(2021)" },
{ "highway-2018-compilation-docs", "2018公路系列定额编制办法及说明" },
{ "inland-shipping-2019-budget-quota", "内河航运工程预算定额(2019)" },
{ "dredging-2019-budget-quota", "疏浚工程预算定额(2019)" },
{ "coastal-port-hydraulic-2019-quota", "沿海港口水工建筑工程定额(2019)" },
{ "distribution-network-20kv-2022-docs", "20kV及以下配电网工程预规及定额章节说明(2022年版)" },
{ "hydropower-budget-quota-docs-2024", "水电工程概预算定额说明文档(2024)" },
{ "water-conservancy-budget-rules-docs-2024", "水利概预算工程及编规说明文档" },
{ "soil-water-conservation-estimate-quota-docs-2024", "水土保持工程概算定额(2024)说明文档" },
评论0