如何列出包含SPAN的所有TD元素?

时间:2014-03-27 13:15:18

标签: c# xpath html-agility-pack fizzler

我尝试使用Fizzler在C#中解析网站。我的目标是获得这个元素: / html / body / form / div [3] / div / div / div / div / div / table / tbody / tr [18] / td [2] / span(FireBug XPath)。

问题是TR和TD编号不固定。所有我知道我总是需要最后一个跨度,在最后一个TD,最后一个TR :)

我正在尝试这个,但我得到的只是NULL:

HtmlWeb document = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = document.Load("http://websiteaddress.com/site-name.html");

HtmlNodeCollection tableDatas = doc.DocumentNode.SelectNodes("//table/tbody/tr/td/span").Last();

这是我试图解析的表。我只需要最后一行最后一个td中最后一个跨度的内容。

<table id="ctl00_WebPartManager1_blablabla_ctl00_tblRates" cellspacing="5" cellpadding="5" rules="all" border="1" style="width:100%;">
                <tr>
                    <th></th><th><span>USD</span></th>
                </tr><tr>
                    <th></th><th><span>USA $</span></th>
                </tr><tr>
                    <th></th><th><span>1</span></th>
                </tr><tr>
                    <td><span>2014. 03. 03.</span></td><td><span>227,31 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 04.</span></td><td><span>226,79 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 05.</span></td><td><span>225,66 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 06.</span></td><td><span>225,03 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 07.</span></td><td><span>223,14 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 10.</span></td><td><span>224,63 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 11.</span></td><td><span>226,06 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 12.</span></td><td><span>226,53 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 13.</span></td><td><span>223,63 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 14.</span></td><td><span>225,74 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 17.</span></td><td><span>224,67 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 18.</span></td><td><span>224,65 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 19.</span></td><td><span>223,26 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 20.</span></td><td><span>225,94 </span></td>
                </tr><tr>
                    <td><span>2014. 03. 21.</span></td><td><span>226,25 </span></td>
                </tr>
            </table>

这是我从document.load()方法得到的结果(它有点搞砸......):

    <table id="ctl00_WebPartManager1_blablabla_ctl00_tblRates" cellspacing="5" cellpadding="5" rules="all" border="1" style="width:100%;">
                <tr>
                    <th><th><span>USD</span>
                <tr>
                    <th><th><span>USA $</span>
                <tr>
                    <th><th><span>1</span>
                <tr>
                    <td><span>2014. 03. 03.</span><td><span>227,31 </span>
                <tr>
                    <td><span>2014. 03. 04.</span><td><span>226,79 </span>
                <tr>
                    <td><span>2014. 03. 05.</span><td><span>225,66 </span>
                <tr>
                    <td><span>2014. 03. 06.</span><td><span>225,03 </span>
                <tr>
                    <td><span>2014. 03. 07.</span><td><span>223,14 </span>
                <tr>
                    <td><span>2014. 03. 10.</span><td><span>224,63 </span>
                <tr>
                    <td><span>2014. 03. 11.</span><td><span>226,06 </span>
                <tr>
                    <td><span>2014. 03. 12.</span><td><span>226,53 </span>
                <tr>
                    <td><span>2014. 03. 13.</span><td><span>223,63 </span>
                <tr>
                    <td><span>2014. 03. 14.</span><td><span>225,74 </span>
                <tr>
                    <td><span>2014. 03. 17.</span><td><span>224,67 </span>
                <tr>
                    <td><span>2014. 03. 18.</span><td><span>224,65 </span>
                <tr>
                    <td><span>2014. 03. 19.</span><td><span>223,26 </span>
                <tr>
                    <td><span>2014. 03. 20.</span><td><span>225,94 </span>
                <tr>
                    <td><span>2014. 03. 21.</span><td><span>226,25 </span>

            </td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></th></th></tr></th></th></tr></th></th></tr></table>

有人可以帮帮我吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

除了<tbody>元素being introduced by the browser之外,而不是HTML Agility Pack(这就是为什么你根本没有收到任何结果);使用[last()谓词来访问当前元素中的最后一个子节点。

//table/tr[last()]/td[last()]/span[last()]

你也可以查询所有的最后一个跨度,但这可能会慢一点,因为它必须在构造整个结果集之前:

(//table/tr/td/span)[last()]

在C#中使用.Last();甚至会稍差一些,因为在省略除最后一个值之外的所有内容之前,结果集甚至必须构造为C#数组。

答案 1 :(得分:0)

您可以使用last()而不是精确元素位置来获取结果集中的最后一个元素:

//table/tr[last()]/td[last()]/span[last()]

上面的XPath将获得最后一个<tr>,然后查找<td>中的最后一个<tr>,然后查找<span>中的最后一个<td>

如果这不是您正在寻找的内容,我建议您发布示例HTML,以便我们更轻松地了解问题。