2011-07-06 10 views
1

私はHtmlAgilityPackを使用してWebサイトからHtmlを取得しています。HtmlAgilityPackアルゴリズムの質問

<table class="table"> 
<tr> 
    <td> 
     <table class="innertable">...</table> 
    </td> 
</tr> 
<tr> 
    <td colspan="2"><strong>Contact</strong></td> 
</tr> 
<tr> 
    <td colspan="2">John Doe</td> 
</tr> 
<tr> 
    <td colspan="2">Jane Doe</td> 
</tr> 
<tr> 
    <td colspan="2">&nbsp;</td> 
</tr> 
<tr> 
    <td><strong>Units</strong></td> 
    <td>32</td> 
</tr> 
<tr> 
    <td><strong>Year</strong></td> 
    <td>1998</td> 
</tr> 
</table> 

コンテキスト::ここで

は、受信したHTMLです

私が最初に取得するには、次のコードを使用しています:

var table = document.DocumentNode.SelectNodes("//table[@class='table']").FirstOrDefault(); 

私は」次のコードを使用して内部テーブルを取得します。

var innerTable = table.SelectNodes("//table[@class=innertable]").FirstOrDefault(); 

これまでのところとても良いです!

最初のテーブルからいくつかの情報を取得する必要があり、内側のテーブルから情報を取得する必要があります。 私はする必要がある最初のテーブルからの情報で始まるので(内部テーブルを保持している)最初の行をスキップするので、私は次の操作を行います。私は今、すべてのセルからを有するので

var tableCells = table.SelectNodes("tr[position() > 1]/td"); 

string contact1 = HttpUtility.HtmlDecode(tableCells[1].InnerHtml); 
string contact2 = HttpUtility.HtmlDecode(tableCells[2].InnerHtml); 

string units = HttpUtility.HtmlDecode(tableCells[5].InnerHtml); 
string years = HttpUtility.HtmlDecode(tableCells[7].InnerHtml); 

問題:内部表を除く最初の表は、私は次のことをやって起動

私が欲しい値を得ているハードコード tableCells []のインデックスは、レイアウトが動くとは思わない...残念ながら、動きます。

「Jane Doe」の行がない(上記のHtmlに示されている)場合は、またはに2つの連絡先がない可能性があります。

このため、間違った変数に間違ったデータが含まれる可能性があるため、インデックスをハードコードすることはできません。

だから私は私のアプローチを変更する必要があります...

、誰もがそれを考慮に私は1つのまたは二つの接点を持っているし、おそらく使用していない可能性があるという事実を取ることができるように私は私のアルゴリズムを完成できるか知っていますハードコードインデックス?

ありがとうございます!

vlince

答えて

1

この種の問題に固有の解決策はありません。ここけれども、それのいくつかの種類があるようですXPATHです:

 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
     doc.Load(yourHtmlFile); 

     doc.Save(Console.Out); 

     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//tr[td/strong/text() = 'Contact']/following-sibling::tr/td/text()[. != '&nbsp;']")) 
     { 
      Console.WriteLine(node.OuterHtml); 
     } 

は、この表示されます。

John Doe 
Jane Doe 
32 
1998 
+0

はいサイモンを、あなたは物事を行うためのユニークな方法がありません...正しいです: - ) あなたの記事のおかげで、それは私のアルゴリズムを考え直させてくれました。多分私はあなたのような表現を思いつくためにXPATHについてもっと読む必要があります。どうもありがとう! – Vlince

関連する問題