使用HTML Agility Pack解析表 - 重复结果

时间:2012-11-14 18:44:13

标签: c# html html-agility-pack

我有这个html表:

<div style="width: 398px;">
            <table cellpadding="4" cellspacing="0" width="100%" style="border: 2px solid #ffffff;">
                <tbody>
                    <tr class="parrafo-ver-negro">
                        <th class="borde-abajo borde-derecha" style="text-align: left;">Parada N&ordm;</th>
                        <th class="borde-abajo" style="text-align: left;">Destino</th>
                                                </tr>
                                <tr>
                        <td class="borde-derecha"><a class="parrafo-ver-negro link-nro-sms">5729</a></td>
                        <td class="parrafo_ver-gris letra9">103 NEGRO > Villa Gdor. Galvez<br>103 ROJO > Villa Gdor. Gálvez<br></td>
                                                </tr>
                                    <tr>
                        <td class="borde-derecha"><a class="parrafo-ver-negro link-nro-sms">5292</a></td>
                        <td class="parrafo_ver-gris letra9">103 NEGRO > Granadero Baigorria<br>103 ROJO > Mini Terminal Barrio Rucci<br></td>
                                                </tr>
                  </tbody>
            </table>
        </div>

我的代码是:

public static List<Parada> parsear(string html)
    {
        int cual;
        int _parada;
        string _destino;
        List<Parada> lp = new List<Parada>();
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        foreach (HtmlNode tabla in doc.DocumentNode.SelectNodes("//table"))
        {
            foreach (HtmlNode fila in tabla.SelectNodes("//tr"))
            {
                cual = 1; _parada = 0; _destino = "";

                foreach (HtmlNode celda in fila.SelectNodes("//td"))
                {

                    if (cual == 1)
                    {
                        _parada = Int32.Parse(celda.InnerText);
                        cual = 2;
                    }
                    else if (cual == 2)
                    {
                        _destino = celda.InnerText;
                        cual = 1;

                        lp.Add(new Parada(_parada, _destino));
                    }
                }

            }
        }
        return lp;
    }

我最终会得到两个List of Parada的元素(我必须忽略的第一个TR,因为它是标题),而是我有6个,而不是两个。 代码有什么问题? 我尝试了很多东西,但结果相同。

感谢。

1 个答案:

答案 0 :(得分:1)

fila.SelectNodes仍然遍历整个文档,因此您遍历所有4个td节点3次(每tr个节点一次)。请尝试使用此代码...

public static List<Parada> parsear(string html)
{
    int cual = 0;
    int _parada = 0;
    string _destino = "";
    List<Parada> lp = new List<Parada>();
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);

    foreach (HtmlNode tabla in doc.DocumentNode.SelectNodes("//table//tr//td"))
    {
        cual = 1 - cual;
        if (cual == 1)
        {
            _parada = Int32.Parse(tabla.InnerText);
        }
        else
        {
            _destino = tabla.InnerText;
            lp.Add(new Parada(_parada , _destino));
        }
    }

    return lp;
}