我们可以使用 InnerText 将文本提取到第一个内部 <br/>(如果存在)吗?

Can we extract text up to the first inner <br/> (if it exists) using InnerText?

取这个 HTML(为清楚起见多行):

<li style="list-style-image: url('lib/10.bmp')" class="rvps2">
    <span class="rvts15">Internal: Updated </span>
    <span class="rvts16">Google Calendar Interface</span>
    <span class="rvts15">Nuget Packages:</span>
    <br/>
    <span class="rvts15"></span>
    <br/>
    <span class="rvts15">Google.Apis.1.49.0 -&gt; Google.Apis.1.50.0</span>
    <br/>
    <span class="rvts15">Google.Apis.Auth.1.49.0 -&gt; Google.Apis.Auth.1.50.0</span>
    <br/>
    <span class="rvts15">Google.Apis.Calendar.v3.1.49.0.2187 -&gt; Google.Apis.Calendar.v3.1.50.0.2237</span>
    <br/>
    <span class="rvts15">Google.Apis.Core.1.49.0 -&gt; Google.Apis.Core.1.50.0</span>
    <br/>
    <span class="rvts15">NLog.4.7.6 -&gt; NLog.4.7.8</span>
    <br/>
    <span class="rvts15">NLog.Config.4.7.6 -&gt; NLog.Config.4.7.8</span>
    <br/>
    <span class="rvts15">NLog.Schema.4.7.6 -&gt; NLog.Schema.4.7.8</span>
</li>

我无法更改 HTML 的结构。使用 HTML Agility Pack 我目前有 li 项目的代码:

writer.WriteString(listitem.InnerText.Trim());

问题是 InnerText returns 一切,我不想要那个。

Internal: Update Google Calendar Interface Nuget Packages:

我们可以将文本提取为字符串直到第一个 <br/>(如果存在)吗?

我想这很简单。枚举liChildNodes,取他们的InnerText,用一个space作为分隔符拼接字符串,先停在br.

也许你问的是有没有现成的功能,所以不用这个特殊代码也可以完成,但我想没有。


示例代码:

string itemtext = string.Empty;
foreach(HtmlNode item in listitem.ChildNodes)
{
    // We are only interested in "span" elements
    if(item.Name == "span")
    {
        itemtext += item.InnerText.Trim();
        itemtext += " ";
    }

    // Stop at the first "br" element.
    if (item.Name == "br")
        break;
}

writer.WriteString(itemtext.Trim().Replace(" .", "."));