使用HTML Agility Pack解析表

时间:2012-08-28 22:17:03

标签: c# html-table html-agility-pack

在以下HTML中,我可以解析table元素,但我不知道如何跳过th元素。

我想只获取td元素,但是当我尝试使用时:

foreach (HtmlNode cell in row.SelectNodes("td"))

......我得到了一个例外。

<table class="tab03">
  <tbody>
    <tr>
      <th class="right" rowspan="2">first</th>
    </tr>
    <tr>
      <th class="right">lp</th>
      <th class="right">name</th>
    </tr>
    <tr>
      <td class="right">1</td>
      <td class="left">house</td>
    </tr>
    <tr>
      <th class="right" rowspan="2">Second</th>
    </tr>
    <tr>
      <td class="right">2</td>
      <td class="left">door</td>
    </tr>
  </tbody>
</table>

我的代码:

var document = doc.DocumentNode.SelectNodes("//table");
string store = "";

if (document != null)
{
    foreach (HtmlNode table in document)
    {
        if (table != null)
        {
            foreach (HtmlNode row in table.SelectNodes("tr"))
            {
                store = "";
                foreach (HtmlNode cell in row.SelectNodes("th|td"))
                {
                    store = store + cell.InnerText+"|";
                }

                sw.Write(store );
                sw.WriteLine();  
            }
        }
    }
}

sw.Flush();
sw.Close(); 

2 个答案:

答案 0 :(得分:3)

您的XPath语法不正确。请尝试:

HtmlNode cell in row.SelectNodes("//td")

这将为您提供可以使用td进行迭代的foreach元素集合。

答案 1 :(得分:3)

此方法使用LINQ查询名​​称为HtmlNode的{​​{1}}个实例。

我还注意到您的输出显示为td(带有尾随管道),此示例使用val|val|作为删除该尾随管道的一种不太可怕的方法:string.Join(pipe, array)

val|val