XPath查询不适用于此表

时间:2015-03-19 10:49:40

标签: c# xpath html-agility-pack

我有很多这种格式的表格:

 <table class="DataRows" frame="myFrames" rules="Standard" width="100%">

  <colgroup><col width="70" align="CENTER">
  <col width="200" align="LEFT">
  <col width="80" align="LEFT">
  <col align="LEFT">
  <col align="RIGHT">

  </colgroup><thead>

  <col width="70" align="CENTER">
  <col width="200" align="LEFT">
  <col width="80" align="LEFT">
  <col align="LEFT">
  <col align="RIGHT">

  <thead>

  <tr>
    <td valign="TOP"><span class="classicBold"> 20 </span> Kg.
    <td class="BOLD" valign="TOP" nowrap="">
      PA Passion Foods Inc.
    <td class="BOLD">Fax:
    <td>
      222-555666
    <td class="BOLD">
      Processed foods and juices

  <tr>
    <td><a target="_blank" href="">See on Map </a>
    <td>
      120 NW 157TH AVE 
    <td class="BOLD">Warehouse Hours:
    <td colspan="2">


  <tr>
    <td>
    <td><span class="BOLD">
      Jacksonville,
      </span>
      FL 300000
    <td class="BOLD">Url:
    <td colspan="2">
      <a target="_blank" href="">PA Passion</a>
      &nbsp&nbsp
      <span class="BOLD">E-mail:</span>
      zoro@xyz.com

  <tr>
    <td>
    <td class="REDBOLD" colspan="4">


  <tr>
    <td>
    <td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
 Nutrella


</span>
  <tr>
    <td>
    <td colspan="4" align="LEFT">Franchisee for:<span class="BOLD">
APPLE Foods, Constants
</span>
  <tr>
    <td>
    <td colspan="4" align="LEFT"><span class="BOLD">

</span>

  <tr>
    <td>
    <td colspan="4" align="LEFT">We service:<span class="BOLD">
All occasions and hospitality services
</span>

  <tr>
    <td>
    <td colspan="4" align="LEFT">We sell :<span class="BOLD">
----
</span>

</td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></tr></td></td></td></td></tr></td></td></td></td></tr></td></td></td></td></td></tr>
  </thead>
</table>

我正在使用HtmlAgilityPack使用此代码循环遍历每个表

foreach (HtmlNode node in htmlAgilityPackDoc.DocumentNode.SelectNodes("//table[contains(@class,'DataRows')]"))
{

}

这给了我每次迭代的整个节点,其中一个是上面的表。我尝试使用下面的代码在每次迭代中访问公司名称。

string str= node.ChildNodes.Descendants() .SelectSingleNode("//td[@class='BOLD']").InnerText

但我得到的只是循环中提取的每个表的第一个表的公司名称。当我通过循环中的每个表时,如何获得下一个公司名称和地址?

2 个答案:

答案 0 :(得分:1)

当尝试从//轴开始执行相对XPath时,这是一个常见的错误。尽管您从SelectSingleNode()变量调用node,但XPath仍被视为全局,这意味着它相对于XML的根元素。这就是为什么你每次总是得到相同的元素,它是整个XML中第一个匹配的元素。

要使XPath范围在当前node元素内是本地的,只需在XPath的开头放一个点(.):

string str = node.SelectSingleNode(".//td[@class='BOLD']")
                 .InnerText;

答案 1 :(得分:0)

node.SelectSingleNode(By.Xpath(.//td[@class='BOLD'])).Innertext

这可能有用。 如评论中所述,使用HAP应该将XPath用作前xpath的“扩展”以“。”开头 - 如果我没记错的话,当前节点