2016-05-13 119 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; 
       } 
      }