2016-05-13 164 views
0

下面是我的HTML結構(表):解析HTML結構

<table> 
    <tr><td>A</td></tr> 
</table> 
<table> 
    <tr><td>B</td></tr> 
</table> 
<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

我試圖讓數據如下:

HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]"); 

⇒它運作良好。

但是,我試過代碼如下表3

HtmlNode thediv = doc.DocumentNode.SelectSingleNode(
         "//table[3]//table[1]//table[2]//table[3]"); 

⇒不正常獲取數據ABC/DEF。

回答

0

我想你真正想要的是

var bothNodes = doc.DocumentNode.SelectNodes("//table[3]//table[1]//tr/td[1]/text()"); 

這會給你兩個節點ABC和第三臺的DEF

你可以在這裏嘗試一下:XPathFiddle

你的代碼沒有按」 t工作,因爲沒有適合第二個查詢的節點。 分步:

這是你原來的HTML:

<table> 
    <tr><td>A</td></tr> 
</table> 
<table> 
    <tr><td>B</td></tr> 
</table> 
<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

//table[3]給你第三個表

<table> 
    <table> 
     <table> 
      <table> 
       <tbody> 
        <tr class="A"> 
         <td> 
          ABC 
         </td> 
         <td> 
          <a href="abc.com">Link</a> 
         </td> 
        </tr> 
        <tr class="B"> 
         <td> 
          DEF 
         </td> 
         <td> 
          <a href="abcd.com">Link2</a> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </table> 
    </table> 
</table> 

//table[3]//table[1]給你的第一個表這是第三個表的後裔。

<table> 
    <table> 
     <table> 
      <tbody> 
       <tr class="A"> 
        <td> 
         ABC 
        </td> 
        <td> 
         <a href="abc.com">Link</a> 
        </td> 
       </tr> 
       <tr class="B"> 
        <td> 
         DEF 
        </td> 
        <td> 
         <a href="abcd.com">Link2</a> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
    </table> 
</table> 

//table[3]//table[1]//table[2]會給你第二個表,這是一個後代的第一個表這是第三個表的後裔。而且只有一個 - >不起作用。

+0

嗨曼弗雷德Radlwimmer, 感謝您的回答。我做的 :)。 – tranphu0ng

0

嗨Manfred Radlwimmer,

感謝您的回答。我做的 :)。

的代碼如下:

if (doc.DocumentNode.SelectNodes("//table") != null) 
      { 
       HtmlNode thediv = doc.DocumentNode.SelectSingleNode("//table[3]//table[1]//tr/td[1]//tr[3]//table//tr/td[2]//table"); 
       HtmlNodeCollection cells = thediv.SelectNodes("tr"); 
       for (var j = 1; j < cells.Count; ++j) 
       { 
        var data= cells[j].InnerText; 
       } 
      }