6

HTMLアジリティパックを使用してHTMLテーブルを解析したい。テーブルから定義済みの列データのみを抽出したいと考えています。

しかし、私は解析と html アジリティ パックに不慣れで、試してみましたが、必要に応じて html アジリティ パックを使用する方法がわかりません。

誰かが知っているなら、可能であれば例を挙げてください

編集 :

決定した列名のデータだけを抽出したい場合のように、html テーブルを解析することはできますか? name、address、phnoの4つの列があるように、名前と住所のデータのみを抽出したい。

4

1 に答える 1

6

ここのディスカッション フォーラムにその例があります。少し下にスクロールして、表の回答を確認します。より見つけやすく、より良いサンプルを提供してくれることを願っています。

編集: 特定の列からデータを抽出するには、最初に必要な列に対応するタグを見つけて、<th>それらのインデックスを覚えておく必要があります。<td>次に、同じインデックスのタグを見つける必要があります。列のインデックスを知っていると仮定すると、次のようなことができます。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("http://somewhere.com");
HtmlNode table = doc.DocumentNode.SelectSingleNode("//table");
foreach (var row in table.SelectNodes("//tr"))
{
    HtmlNode addressNode = row.SelectSingleNode("td[2]");
    //do something with address here
    HtmlNode phoneNode = row.SelectSingleNode("td[5]");
    // do something with phone here
}

Edit2:列のインデックスがわからない場合は、このようにすべてを行うことができます。私はこれをテストしていません。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("http://somewhere.com");
var tables = doc.DocumentNode.SelectNodes("//table");

foreach(var table in tables)
{
    int addressIndex = -1;
    int phoneIndex = -1;
    var headers = table.SelectNodes("//th");
    for (int headerIndex = 0; headerIndex < headers.Count(); headerIndex++)
    {
        if (headers[headerIndex].InnerText == "address")
        {
            addressIndex = headerIndex;
        }
        else if (headers[headerIndex].InnerText == "phone")
        {
            phoneIndex = headerIndex;
        }
    }

    if (addressIndex != -1 && phoneIndex != -1)
    {
        foreach (var row in table.SelectNodes("//tr"))
        {
            HtmlNode addressNode = row.SelectSingleNode("td[addressIndex]");
            //do something with address here
            HtmlNode phoneNode = row.SelectSingleNode("td[phoneIndex]");
            // do something with phone here
        }
    }
}
于 2010-03-11T06:14:23.630 に答える