2017-02-21 13 views
0

私は、次のHTMLを解析して問題を抱えている:HtmlAgilityPack:終了行を解析できません(エンドラインを無視します)

<tr> 
<td><p><b> 
<span>Company:</span></b> 
<span>Test</span> 
</p></td> 
</tr> 

<tr> 
<td><p><b> 
<span>Company:</span></b> 
<span>Test 2</span> 
</p></td> 
</tr> 

私のコードは次のとおりです。

HtmlDocument doc = new HtmlDocument(); 
doc.Load(@"email.txt"); 
Console.WriteLine(doc1.DocumentNode.InnerText); 

私は次の出力を持っている:Company:TestCompany:Test 2しかし、私が望む

Company: Test 
Company: Test 2 

したがって、問題は改行が解析されていないことです。

P.S .: doc.OptionWriteEmptyNodes = true;は違いがありません。

更新:私は、何かHTMLがあれば、それは最終行を解析していないことを意味します。 <br />タグなどがある場合でも

+0

をあなたのhtmlには改行がありません使用します。ブラウザでも表示されない場合は、両方のラベルが並べて表示されます。あなたの実際の要件は何ですか? 'Document.InnerText'はすべてのテキストコントロールの値を並べて返します。必要がない場合は、必要なもの(すべてのスパン)を選択してから、 'String.Join(Environment.NewLine、allInnerText)'を使用する必要があります。 –

+0

@TimSchmelter、InnerTextをブラウザからコピーしたような文字列を取得したい。 したがって、改行がある場合、それらもinnertext(\ n)にあるはずです。 –

答えて

1

あなたのhtmlに改行はありません。ブラウザでも表示されない場合は、両方のラベルが並べて表示されます。あなたの実際の要件は何ですか? Document.InnerTextは、すべてのテキストコントロールの値を並べて返します。あなたはあなたが望むものを選択する必要があることたくない場合は

(f.e。すべてのスパン)、その後はString.Join(Environment.NewLine, allInnerText)

var allInnerTexts = doc.DocumentNode.SelectNodes("//text()") 
    .Select(n => n.InnerText.Trim()) 
    .Where(text => !String.IsNullOrEmpty(text)); 
Console.WriteLine(String.Join(Environment.NewLine, allInnerTexts)); 
+0

@ R.Matveev:まあ、タグ名でフィルタリングしないので、 'span'などのフィルタは必要ありません。' text'はすべてのために機能します –

+0

これは、テキストを単に分割するという意味です ...タグの間にあるものは何ですか? –

+0

これはすべてのネストされたノードで機能しますか? –

関連する問題