HtmlAgilityPack XPath 错误

Posted

技术标签:

【中文标题】HtmlAgilityPack XPath 错误【英文标题】:HtmlAgilityPack XPath Errors 【发布时间】:2012-08-22 07:44:17 【问题描述】:

我正在尝试使用 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);
        
    


但是,当我用断点点击第一行时,我收到了一个奇怪的错误,我在这里截取了我的问题的屏幕截图:

但是,如果我删除断点,当我点击第二个 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 术语的问题。我使用this post 的路径来抓取表格的行和列,它按预期工作。 我已经意识到我在屏幕截图中遇到的奇怪错误与调试有关,当我尝试进入 XPath 逻辑时,我得到了那个错误。仍然不确定如何解决这个问题,但它就是这样。 【参考方案1】:

如果您使用以下代码,它会按预期工作:

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

【讨论】:

以上是关于HtmlAgilityPack XPath 错误的主要内容,如果未能解决你的问题,请参考以下文章

Android C# HtmlAgilityPack

使用 Xpath 和 HtmlAgilityPack 的节点为 NULL

C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

XPath/HtmlAgilityPack:如何查找具有属性 (href) 特定值的元素 (a) 并查找相邻的表列?

如何使用 C# 转义 XPath 引号“”

XPath 搜索所有文本节点,而不是任何其他子节点的内部文本