HTML Agility Packでテーブルを解析する

c# html-agility-pack html-table

質問

以下のHTMLでは、私は、解析することができtable要素を、私はスキップする方法がわからないth要素を。

私はtd要素だけを取得したいが、私が使用しようとすると:

foreach (HtmlNode cell in row.SelectNodes("td"))

...私は例外があります。

foreach (HtmlNode cell in row.SelectNodes("td"))

私のコード:

foreach (HtmlNode cell in row.SelectNodes("td"))

受け入れられた回答

このメソッドは、LINQを使用して、名前がtd HtmlNodeインスタンスを照会します。

私はあなたの出力がval|val| (後続のパイプを使用)、このサンプルでは、​​後続のパイプval|valval|valを削除する方法としてstring.Join(pipe, array)を使用しています。

using System.Linq;

// ...

var tablecollection = doc.DocumentNode.SelectNodes("//table");
string store = string.Empty;

if (tablecollection != null)
{
    foreach (HtmlNode table in tablecollection)
    {
        // For all rows with at least one child with the 'td' tag.
        foreach (HtmlNode row in table.DescendantNodes()
            .Where(desc =>
                desc.Name.Equals("tr", StringComparison.OrdinalIgnoreCase) &&
                desc.DescendantNodes().Any(child => child.Name.Equals("td",
                    StringComparison.OrdinalIgnoreCase))))
        {
            // Combine the child 'td' elements into an array, join with the pipe
            // to create the output in 'val|val|val' format.
            store = string.Join("|", row.DescendantNodes().Where(desc =>
                desc.Name.Equals("td", StringComparison.OrdinalIgnoreCase))
                .Select(desc => desc.InnerText));

            // You can probably get rid of the 'store' variable as it's
            // no longer necessary to store the value of the table's
            // cells over the iteration.
            sw.Write(store);
            sw.WriteLine();
        }
    }
}

sw.Flush();
sw.Close(); 

人気のある回答

XPath構文が正しくありません。してみてください:

HtmlNode cell in row.SelectNodes("//td")

foreach使用して反復できるtd要素のコレクションを取得します。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ