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

使用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}");
}

代码说明

  1. 按章节分组:通过dom["span.verse"]选中每一节的容器,确保我们处理的是单节内容。
  2. 提取章节号:从每个章节容器内的span.label获取编号。
  3. 拼接内容文本:收集当前章节下所有span.content的文本,过滤空内容后拼接,再清理多余空格,避免文本中出现大量空白。
  4. 排除注释内容:因为注释都在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:51