HtmlAgility Pack很难从嵌套表中获取信息

时间:2012-04-12 15:33:43

标签: html-parsing html-agility-pack

我试图解析下面的表,但不幸的是每个节点似乎互相嵌套。 :(不可能获得childnodes因为它总是给count = 1

这很有意思,但它正在寻找;例如,下一个“tr”作为前一个tr?

的子节点

你有什么想法吗?

<table width="292px" border="0">
    <tr>
        <td>
        </td>
    </tr>
    <tr>
        <td>
            <table>
                <tr>
                    <td colspan="2" bgcolor="#FBCE9D" align="center" height="40">
                    </td>
                </tr>
                <tr>
                    <td bgcolor="#FFF4D2" height="25" width="60">
                    </td>
                    <td height="25" bgcolor="#e8e8e8">
                    </td>
                </tr>
                <tr>
                    <td bgcolor="#FFF4D2" height="25" width="60">
                    </td>
                    <td height="25" bgcolor="#e8e8e8">
                    </td>
                </tr>
                <tr>
                    <td bgcolor="#FFF4D2" height="25" width="60">
                    </td>
                    <td height="25" bgcolor="#e8e8e8">
                    </td>
                </tr>
                <tr>
                    <td bgcolor="#FFF4D2" height="25" width="60">
                    </td>
                    <td height="25" bgcolor="#e8e8e8">
                    </td> //Here is a missing "</tr>" and I think this one is confusing the agilitypack!
                    <tr>
                        <td bgcolor="#FFF4D2" height="35" colspan="2" align="center">
                        </td>
                    </tr>
            </table>
        </td>
    </tr>
</table>

我的代码是:

var webGet = new HtmlWeb();
var doc = webGet.Load("the url where this table is located");
HtmlNodeCollection tb = doc.DocumentNode.SelectNodes("//table[@width='292px']");
                        var table = tb[0].ChildNodes[1].ChildNodes[0].ChildNodes[0].ChildNodes;
                        for (var na = 0; na < table.Count; na++)
                        { .....do the work.... }

实际上这段代码之前就像魅力一样,但它们嵌套了另一张桌子,因为没有ChildNodes[1]它始终是ChildNodes[1]

再说一遍; Firebug显示“/ html / body / table / tbody / tr [2] / td / table / tbody”作为嵌套表的XPath,但是您可能会注意到“tbody”不熟悉htmlagility,因为它是由动态生成的浏览器用于删除缺少的关闭标记/ tr

2 个答案:

答案 0 :(得分:1)

这真的很有趣,但问题是HmtlAgility包实际上可以在Nuget获得!我将其删除并从网上下载(http://htmlagilitypack.codeplex.com/)。它现在正在运作!

答案 1 :(得分:0)

XPATH会在这里帮到你很多。

对于内部表tr节点,您可以尝试以下

doc.DocumentNode.SelectNodes("//table[@width='292px']/tr/td/table/tr")

如果要在内部表中遍历td个节点,那么

doc.DocumentNode.SelectNodes("//table[@width='292px']/tr/td/table/tr/td")