9

私はこのようなテーブルを持っています

<table border="0" cellpadding="0" cellspacing="0" id="table2">
    <tr>
        <th>Name
        </th>
        <th>Age
        </th>
    </tr>
        <tr>
        <td>Mario
        </td>
        <th>Age: 78
        </td>
    </tr>
            <tr>
        <td>Jane
        </td>
        <td>Age: 67
        </td>
    </tr>
            <tr>
        <td>James
        </td>
        <th>Age: 92
        </td>
    </tr>
</table>

そして、HTMLAgilityPackを使用して解析したいと考えています。私はこのコードを無駄に試しました:

foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
{
    foreach (HtmlNode col in row.SelectNodes("//td"))
    { 
        Response.Write(col.InnerText); 
    }
}

私は何が間違っているのですか?

4

4 に答える 4

7

tds を直接選択してみませんか?

foreach (HtmlNode col in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td"))
    Response.Write(col.InnerText);

trあるいは、他の処理のために s が本当に必要な場合は、 を削除して次の//ようにします。

foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
    foreach (HtmlNode col in row.SelectNodes("td"))
        Response.Write(col.InnerText);

もちろん、それはtds が s の直接の子である場合にのみ機能しtrますが、そうすべきですよね?


編集:

var cols = doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td");
for (int ii = 0; ii < cols.Count; ii=ii+2)
{
    string name = cols[ii].InnerText.Trim();
    int age = int.Parse(cols[ii+1].InnerText.Split(' ')[1]);
}

LINQ を使用してこれを行うには、おそらくもっと印象的な方法があります。

于 2013-02-19T22:43:35.823 に答える
4

コードを実行したところ、正しいNamesのみが表示されました。 Agesは無効な HTML: <th></td>(おそらく入力ミス) を使用して定義されているためです。

ところで、コードは 1 つのループだけに単純化できます。

foreach (var cell in doc.DocumentNode.SelectNodes("//table[@id='table2']/tr/td"))
{
    Response.Write(cell.InnerText);
}

テストに使用したコードは次のとおりです。http://pastebin.com/euzhUAAh

于 2013-02-19T22:44:45.287 に答える
1

完全な xpath を提供する必要がありました。@Coda ( https://stackoverflow.com/a/3104048/1238850 ) の提案から Firebug を使用して完全な xpath を取得し、次のコードで終了しました。

foreach (HtmlNode row in doc.DocumentNode.SelectNodes("/html/body/table/tbody/tr/td/table[@id='table2']/tbody/tr"))
{
    HtmlNodeCollection cells = row.SelectNodes("td");
    for (int i = 0; i < cells.Count; ++i)
    {
        if (i == 0)
        { Response.Write("Person Name : " + cells[i].InnerText + "<br>"); }
        else {
            Response.Write("Other attributes are: " + cells[i].InnerText + "<br>"); 
        }
    }
}

これよりもずっとうまく書くことができると確信していますが、今はうまくいっています。

于 2013-02-20T21:58:47.973 に答える