HtmlAgilityPack XPath错误

3
我正在尝试使用C# + XNA和HtmlAgilityPack解析网页,但是在尝试根据此帖子中的示例解析表格时(HTML Agility pack - parsing tables),我遇到了一些非常奇怪的问题。以下是我稍微修改了其他帖子的代码:
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
{
    spriteBatch.DrawString(font, table.Id, new Vector2(0, num * 16), Color.Black);
    num++;
    foreach (HtmlNode row in table.SelectNodes("tr"))
    {
        spriteBatch.DrawString(font, "row", new Vector2(0, num * 16), Color.Black);
        num++;
        foreach (HtmlNode cell in row.SelectNodes("th|td"))
        {
            spriteBatch.DrawString(font, "cell: " + cell.InnerText, new Vector2(0, num * 16), Color.Black);
        }
    }

}

然而,当我在第一行设置断点时,我遇到了一个奇怪的错误,我已经截取了一个屏幕截图来展示我的问题: http://i.imgur.com/JxzJ9.png 但是,如果我移除断点,当我进入第二个foreach循环时,就会得到一个NullReferenceException异常。我猜想在XPath中没有返回任何实际的表格,但第一个错误让我感到困惑。如果这只是一个XPath问题,我将花更多时间尝试理解如何使用它。
这是我正在尝试解析的网页:
<div class="page">
    <header>

        <nav>
            <ul id="menu">
                <li><a href="/">Home</a></li>
                <li><a href="/Home/About">About</a></li>
                <li><a href="/Score">Scoreboard</a></li>
            </ul>
        </nav>
    </header>
    <section id="main">

<h2>High Scores</h2>
<div id="grid">
<table class="grid">
<thead>
<tr class="head">
<th scope="col">
    <a href="/Score?sort=Name&amp;sortdir=ASC">Name</a>
</th>

<th scope="col">
    <a href="/Score?sort=Points&amp;sortdir=DESC">Points</a>
</th>

<th scope="col">
    <a href="/Score?sort=Date&amp;sortdir=ASC">Date</a>
</th>
</tr>
</thead>

<tbody>
<tr>
    <td>sec_goat</td>
    <td>10</td>
    <td>9/8/1980 12:00:00 AM</td>
</tr>

<tr class="alt">
    <td>tankorsmash</td>
    <td>100</td>
    <td>10/10/2010 12:00:00 AM</td>
</tr>

<tr>
    <td>sec_goat</td>
    <td>1000</td>
    <td>8/12/2012 12:00:00 AM</td>
</tr>

<tr class="alt">
    <td>tankorsmash</td>
    <td>10000</td>
    <td>12/12/2012 12:00:00 AM</td>
</tr>

<tr>
    <td>sec_goat</td>
    <td>100000</td>
    <td>1/1/2013 12:00:00 AM</td>
</tr>

<tr class="alt">
    <td>tankorsmash</td>
    <td>1000000</td>
    <td>9/18/2012 12:00:00 AM</td>
</tr>

<tr>
    <td>bob</td>
    <td>99999999</td>
    <td>9/8/1980 12:00:00 AM</td>
</tr>


我相当确定这是我XPath术语的问题。我使用了来自此帖子 的路径来获取表格行和列,并且它正在按预期工作。 - sec_goat
我意识到屏幕截图中出现的奇怪错误与调试有关,当我尝试进入XPath逻辑时就会出现该错误。仍然不确定如何修复它,但事实就是这样。 - sec_goat
1个回答

0
如果您使用以下代码,它将按预期工作:
var doc = new HtmlDocument();
doc.LoadHtml(HTML);
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table"))
{
    foreach (HtmlNode row in table.SelectNodes("//tr"))
    {
        foreach (HtmlNode cell in row.SelectNodes("th|td"))
        {
            //don't use .ChildNodes[1] in real code, only works for <th>.
            Debug.WriteLine(cell.ChildNodes[1].InnerHtml); 
        }
    }
}

正如您所见,我将XPath语句从"tr"改为了"//tr"。如果您想更加熟悉XPath语法,我建议您参考这个页面:http://www.w3schools.com/xpath/xpath_syntax.asp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接