HTML Agility Pack - ノードの後に​​テキストをつかむ

c# html html-agility-pack

質問

私はC#を使用して解析しているいくつかのHTMLを持っている

サンプルテキストは下にありますが、これは異なるレコードで約150回繰り返されます

<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>

私は、次のような配列のテキストを取得しようとしています

<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>

私は配列内のテキストを取得することができますが、私はちょうど、STRONGの閉じたタブの後のテキストをBRタグまで取得してから、次のSTRONGタグを見つけることができません

どんな助けもありがとう

受け入れられた回答

あなたは、XPathを使用することができますfollowing-sibling::text()[1]テキストノードは、それぞれの直後に位置取得するstrong 。ここでは最小限の完全な例を示します。

var raw = @"<div>
<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
        </div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//strong"))
{
    var val = node.SelectSingleNode("following-sibling::text()[1]");
    Console.WriteLine(node.InnerText + ", " + val.InnerText);
}

dotnetfiddle demo

出力:

var raw = @"<div>
<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
        </div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//strong"))
{
    var val = node.SelectSingleNode("following-sibling::text()[1]");
    Console.WriteLine(node.InnerText + ", " + val.InnerText);
}

必要に応じて、単純な文字列操作を行うことで、 ":"を削除することができます。


人気のある回答

<strong>は一般的なタグなので、指定したサンプルフォーマットに固有のものです。

var html = @"
<div>
<strong>First name</strong><em>italic</em>: Fake<br>
<strong>Bold</strong> <a href='#'>hyperlink</a><br>.
<strong>bold</strong>
<strong>bold</strong> <br>
text
</div>

<div>
<strong>Title</strong>: Mr<BR>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
</div>";

var document = new HtmlDocument();
document.LoadHtml(html);
// 1. <strong>
var strong = document.DocumentNode.SelectNodes("//strong");
if (strong != null)
{
    foreach (var node in strong.Where(
        // 2. followed by non-empty text node
        x => x.NextSibling is HtmlTextNode
        && !string.IsNullOrEmpty(x.NextSibling.InnerText.Trim())
        // 3. followed by <br>
        && x.NextSibling.NextSibling is HtmlNode
        && x.NextSibling.NextSibling.Name.ToLower() == "br"))
    {
        Console.WriteLine("{0} {1}", node.InnerText, node.NextSibling.InnerText);
    }
}



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ