私は私がによって分割ラインのセットを抽出できるように、特定の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
を取得することができました
List<HtmlNode> nodes = htmlDoc.DocumentNode
.Descendants("div")
.Where(x => x.Attributes.Contains("class") &&
x.Attributes["class"].Value.Contains("PlainText")).ToList();
私はここからどこに行くべきか全面的にはわかりません、私は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
ノードであるかどうかを調べ、存在しない場合は現在のノードを取る結果: