0

C# 言語と HtmlAgilityPack を使用して、いくつかの html ファイルの解析に取り組んでいます。

データベースに挿入するために、行ごとに2つの列の値を取得しようとしています。ただし、次を実行します。

foreach (HtmlNode row in htmlDoc.DocumentNode.SelectNodes("//tr"))
    {
    foreach (HtmlNode cell in row.SelectNodes("//td"))
    {
    Console.WriteLine(cell.InnerText);
    }
    }

現在の tr に含まれているものだけでなく、すべての td をループするとエラーが発生しました。

私のhtmlは次のようになります:

<table>
        <tr>            
            <th align="center" width="50"><b>column 1</b></th>          
            <th align="center" width="210"><b>column 2</b></th>                 

        </tr>   



            <tr bgcolor="#ffffff">
                <td align="left"> </td>             
                <td align="left"></td>                          

            </tr>   


            <tr bgcolor="#dddddd">
                <td align="left"> </td>             
                <td align="left"></td>                          

            </tr>   


            <tr bgcolor="#ffffff">
                <td align="left"> </td>             
                <td align="left"></td>                          

            </tr>
4

2 に答える 2

0

多分これ

var rows = doc.DocumentNode
              .SelectNodes("//tr")
              .Select((z, i) => new
                  {
                    RowNumber = i,
                    Cells = z.ChildNodes.Where(c => c.NodeType == HtmlNodeType.Element) })
              .ToList();

rows.ForEach(row => Console.WriteLine("{0}: {1}", row.RowNumber, string.Join(", ", row.Cells.Select(z => z.InnerText))));
于 2013-07-18T10:21:04.637 に答える
0

コードを更新したことをお知らせします。コードはうまく機能しますが、見た目はまったく良くありません。

j = htmlDoc.DocumentNode.SelectNodes("//tr").Count;
                    if (j != 0)
                    {

                        for (int i = 2; i < j; ++i)
                        {
                            for (int k = 1; k < 3; k++)
                            {
                                HtmlNodeCollection row = htmlDoc.DocumentNode.SelectNodes("/html/body/table/tr[" + i + "]/td[" + k + "]");
                                Console.WriteLine("nb or row" + row.Count);


                                Console.WriteLine(row[0].InnerText);
                                //Console.Read(); 
                            }
                        }
                    }

このコードを強化するアイデアがあれば、それは素晴らしいことです。

ありがとう、ダミアン

于 2013-07-18T07:40:01.033 に答える