2016-10-05 46 views
1

我有一些HTML,看起來像這樣:如何讓我的XPath只在每個表中搜索?

<table class="resultsTable"> 
    <tbody> 
     <tr class="even"> 
      <td width="35%"><strong>Name</strong></td> 
      <td>ACME ANVILS, INC</td> 
     </tr> 
    </tbody> 
</table> 

和看起來像這樣的一些C#代碼:

var name = document.DocumentNode 
        .SelectSingleNode("//*[text()='Name']/following::td").InnerText 

它高興地返回

ACME ANVILS, INC. 

然而,有一個新的皺紋。有問題的網頁現在返回多個結果:

<table class="resultsTable"> 
    <tbody> 
     <tr class="even"> 
      <td width="35%"><strong>Name</strong></td> 
      <td>ACME ANVILS, INC.</td> 
     </tr> 
    </tbody> 
</table> 
<table class="resultsTable"> 
    <tbody> 
     <tr class="even"> 
      <td width="35%"><strong>Name</strong></td> 
      <td>ROAD RUNNER RACES, LLC</td> 
     </tr> 
    </tbody> 
</table> 

所以現在我有

var tables = document.DocumentNode.SelectNodes("//table/tbody"); 
foreach (var table in tables) 
{ 
    var name = table.SelectSingleNode("//*[text()='Name']/following::td").InnerText; 
    ... 
} 

落在了工作,因爲SelectSingleNode返回null。

如何讓我的XPath實際返回結果,僅在我選擇的特定表中搜索?

回答

2

通過添加第二個表,需要兩個調整:

  1. 改變你絕對的XPath,

    //*[text()='Name']/following::td 
    

    到一個相對於當前tabletbody元素:

    .//*[text()='Name']/following::td 
    
  2. 那裏的帳號n ow在 following::軸上不止一個td元素。

    要麼只是搶了先,

    (.//*[text()='Name']/following::td)[1] 
    

    ,或者更好,對td字符串值使用following-sibling::軸,而不是組合 與測試,而不是一個文本節點上的測試,這可能是掩埋在中間格式化元素下:

    .//td[.='Name']/following-sibling::td 
    

    另請參閱Difference between Testing text() nodes vs string values in XPath

相關問題