0

<td>HTMLAgilityPackを使用してテーブルから収集したHTML 要素の HtmlNodeCollection があります。通常、<tr>テーブル内の要素を選択して要素をループするだけ<td>ですが、残念ながら、<tr>開始タグは JavaScript によって生成され、サーバーからはレンダリングされません。HTML のレンダリング方法を制御することはできません。したがって、次の XPATH クエリから HtmlNodeCollection を取得することにしました。

HtmlNode table = htmlDoc.DocumentNode.SelectSingleNode("//table[@width='100%' and @cellpadding='1' and @cellspacing='1' and @border='0']");
HtmlNodeCollection tds = table.SelectNodes(".//td[@align and string-length(@width)=0]"); // only select td elements that have the align attribute and don't have a width attribute

テーブルには、6 つの列と任意の数の行があります。個々の行をそれぞれ処理し、列を中間データ構造に解析したいと思います。各「行」と「列」を取得するための次のコードがありますが、完全には正しくありません。

int cols = 6; // six columns
int rows = tds.Count / cols;

// loop through the rows
for (int row = 1; row <= rows; row++)
{
    for (int col = 0; col < cols; col++)
    {
        HtmlNode td = tds[col * row]; // get the associated td element from the column index * row index
        MessageBox.Show(td.InnerHtml + "\n" + td.InnerText);
    }
}

行 0 ではなく行 1 から開始し、ゼロを 6 回乗算したくないため、行カウントで終了します。これを行列として扱おうとしていますが、ある行がいつ終了して次の行が開始するかを定義するのに問題があります。すべての行と列を適切にループする方法について何か提案はありますか?

4

1 に答える 1

0

紙にグリッドを描いた後、何が欠けているかが明らかになりました。次のように、現在の行を掛けた列数に列インデックスを追加する必要がありました。

for (int row = 0; row < rows; row++)
{
    for (int col = 0; col < cols; col++)
    {
        HtmlNode td = tds[col + cols * row]; // get the associated td element from the column index * row index
        MessageBox.Show(td.InnerHtml + "\n" + td.InnerText);
    }
}
于 2013-09-10T20:19:01.760 に答える