HTML AgilityPackを使ってブレークラインでHTMLを解析する

c# html-agility-pack parsing

質問

私は私がによって分割ラインのセットを抽出できるように、特定のHTML文字列を解析しようとしています<br/>破断線を。入力HTMLは次のようになります。

<div class="PlainText">
  DATE: 2013-10-28 20:00:43 -0500 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  <br/> //Notice this has two break lines, i would like to stop after seeing two consecutive break lines.
</div>

このdivを使って、より大きなHTML文書を作成すると、 HTML ChildNodesを取得することができました

<div class="PlainText">
  DATE: 2013-10-28 20:00:43 -0500 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  Item 1: Text1 <br/>
  <br/> //Notice this has two break lines, i would like to stop after seeing two consecutive break lines.
</div>

私はここからどこに行くべきか全面的にはわかりません、私は2つのブレークラインを見て停止するまで、すべてのテキストを読んでみたいと思いますか?

EDIT

私はのchildNodes見nodesのVisual Studioランタイムインスペクタで、実際に2本のconsectuiveではありませんが気づい<br/>ラインが、単一のブレークラインと#textそのinnerHTMLのはビーイングの持つタグ\n改行文字。

ここに画像の説明を入力

受け入れられた回答

このようなものはうまくいくはずです

[Test]
public void Test()
{
    var x = ReadTillTwoBr(GetDivClass()).ToList();
}

public HtmlNode GetDivClass()
{
    var html = @"<html><div class=""PlainText"">
            DATE: 2013-10-28 20:00:43 -0500 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            Item 1: Text1 <br/>
            <br   /> //Notice this has two break lines, i would like to stop after seeing two consecutive break lines.
            Item 3
        </div></html>";
    var doc = new HtmlDocument();
    doc.LoadHtml(html);

    return doc.DocumentNode
                .Descendants("div").First(x => x.Attributes.Contains("class") &&
                                                x.Attributes["class"].Value.Contains("PlainText"));

}

public IEnumerable<string> ReadTillTwoBr(HtmlNode node)
{
    var nonEmptyNodes =
        node.ChildNodes.Except(node.ChildNodes.Where(f => f.Name == "#text" && String.IsNullOrWhiteSpace(f.InnerHtml)))
            .ToList();

    foreach (var n in nonEmptyNodes)
    {
        if (IsBr(n) && IsBr(n.NextSibling))
        {
            yield break;
        }

        if (n.Name == "#text")
        {
            yield return n.InnerText.Trim();
        }
    }
}

public bool IsBr(HtmlNode n)
{
    return n != null && n.NodeType == HtmlNodeType.Element && n.Name == "br";
}

返すもの

ここに画像の説明を入力

それが2人のbrの後にコメントを返さなかったことに注目してください

編集:

最後の2つのbrタグの間に改行があると、改行で#textタグを実際に取得するので、空の#text値を削除しました。私はこれが改行の混乱がどこにあるのかと思う。


人気のある回答

必要なdivノードを取得するには、XPath //div[@class='PlainText']を使用できます。また、divから子ノードを取得するときに、次の兄弟ノードをチェックすることもできます。

HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
Func<HtmlNode, bool> notTwoBrakes = 
    n => (n.Name != "br" || n.NextSibling != null && n.NextSibling.Name != "br");
var nodes = doc.DocumentNode.SelectNodes("//div[@class='PlainText']")
               .Select(div => div.ChildNodes.TakeWhile(notTwoBrakes));

私は読みやすさのためだけにインラインラムダを使用しません。条件は次のようになります。

  • 次のノードがヌルかどうかをチェックし、ヌルの場合は現在のノードを取る
  • 次のノードがbrノードであるかどうかをチェックし、そうでない場合は現在のノードを取る
  • 現在のノードがbrノードであるかどうかを調べ、存在しない場合は現在のノードを取る
  • それ以外の場合は、子ノード

結果:

ここに画像の説明を入力




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