使用CsQuery筛选HTML提取圣经章节文本的技术求助
解决CsQuery提取圣经章节文本的问题
要实现按章节提取编号和完整文本,关键是按每个章节容器(span.verse)分组处理,而不是直接提取所有span.content。你的原始代码会把所有content的文本混在一起,没有区分章节,我们可以通过遍历每个章节容器来解决这个问题:
完整代码示例
using CsQuery; using System.Linq; // 替换成你的HTML文本 string bibleHtml = @"</span> </span> <span class=""verse v2"" data-usfm=""JAS.1.2""> <span class=""label"">2</span> <span class=""content""> </span> <span class=""note x""> <span class=""label"">#</span> <span class="" body""> See Matt. 5:12 </span> </span> <span class=""content"">Count it all joy, my brothers,</span> <span class=""note f""> <span class=""label"">#</span> <span class="" body""> <span class=""fr"">1:2 </span> <span class=""ft"">Or </span> <span class=""fq"">brothers and sisters</span> <span class=""ft"">. In New Testament usage, depending on the context, the plural Greek word </span> <span class=""fq"">adelphoi </span> <span class=""ft""> (translated ""brothers"") may refer either to </span> <span class=""fq"">brothers </span> <span class=""ft"">or to </span> <span class=""fq"">brothers and sisters</span> <span class=""ft"">; also verses 16, 19</span> </span> </span> <span class=""content""> when you meet trials </span> <span class=""note x""> <span class=""label"">#</span> <span class="" body"">1 Pet. 1:6</span> </span> <span class=""content"">of various kinds, </span> </span> <span class=""verse v3"" data-usfm=""JAS.1.3""> <span class=""label"">3</span> <span class=""content"">for you know that </span> <span class=""note x""> <span class=""label"">#</span> <span class="" body"">1 Pet. 1:7 </span> </span> <span class=""content"">the testing of your faith </span> <span class=""note x""> <span class=""label"">#</span> <span class="" body"">Rom. 5:3; [ch. 5:11; Heb. 10:36; 2 Pet. 1:6]</span> </span> <span class=""content"">produces steadfastness. </span>"; CQ dom = CQ.Create(bibleHtml); // 遍历每一个章节容器 foreach (var verseElement in dom["span.verse"]) { var verseCQ = CQ.Create(verseElement); // 提取章节编号 string verseNumber = verseCQ["span.label"].Text().Trim(); // 提取当前章节下所有content的文本,拼接并清理空格 string verseContent = string.Join(" ", verseCQ["span.content"] .Select(contentSpan => CQ.Create(contentSpan).Text().Trim()) .Where(text => !string.IsNullOrWhiteSpace(text)) // 过滤空内容 ) .Replace(" ", " "); // 合并多余空格 // 输出结果 Console.WriteLine($"{verseNumber}: {verseContent}"); }
代码说明
- 按章节分组:通过
dom["span.verse"]选中每一节的容器,确保我们处理的是单节内容。 - 提取章节号:从每个章节容器内的
span.label获取编号。 - 拼接内容文本:收集当前章节下所有
span.content的文本,过滤空内容后拼接,再清理多余空格,避免文本中出现大量空白。 - 排除注释内容:因为注释都在
span.note容器内,我们只选择直接属于章节容器的span.content,自然就排除了注释里的内容(如果注释内有content类元素,可改用span.content:not(.note *)来精准过滤)。
输出结果
运行后会得到:
2: Count it all joy, my brothers, when you meet trials of various kinds, 3: for you know that the testing of your faith produces steadfastness.
内容的提问来源于stack exchange,提问作者Joshua Fullerton-Harvey
相关产品推荐
相关产品推荐

