2013-02-27 111 views
1

我正在開發.Net控制檯應用程序。
我想請求一個HTML頁面,然後拿起裏面的一些數據。
我使用Html Agility Pack從響應HTML頁面構建對象模型,並使用xPath選擇節點。Html Agility Pack xPath問題

這裏是響應HTML頁的摘錄:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<!-- ... --> 
<body> 
    <div class="conteneur"> 
     <!-- ... --> 
     <div class="page"> 
      <div class="inter_page"> 
       <!-- ... --> 
       <form action="missions.html" method="post" id="formliste"> 
       <table class="tbl_deco_mini" cellspacing="0" style="width: 30%; margin: 0px;"> 
        <tr> 
         <!-- ... --> 
        </tr> 
        <tr> 
         <td colspan="2" class="td"> 
          <div class="inliste"> 
           <p class="ligne_epee"> 
            <a id="3"></a><a href="http://ffta.mimigyaru.com/missions,affiche_001-moisson-dherbe.html#3" 
             class="simple"> 
             <img src="http://ffta.mimigyaru.com/medias/divers/mission_batail.png" alt="Moisson d'herbe" 
              class="img_middle" title="Moisson d'herbe" /></a>&nbsp;<a href="http://ffta.mimigyaru.com/missions,affiche_001-moisson-dherbe.html#3">001-Moisson 
               d'herbe</a> 
           </p> 
           <!-- ... --> 
          </div> 
         </td> 
        </tr> 
        <tr> 
         <!-- ... --> 
        </tr> 
       </table> 
       </form> 
      </div> 
     </div> 
     <!-- ... --> 
    </div> 
</body> 
</html> 

我想選擇<table>節點這是<form>節點的第一個孩子。
我寫了下面的代碼:

HtmlDocument l_missionsDoc = new HtmlDocument(); 
l_missionsDoc.Load(l_stream); 

XPathNavigator l_navigator = l_missionsDoc.CreateNavigator(); 
XPathNodeIterator l_iterator = l_navigator.Select("//form[@id='formliste']/table"); 

if (l_iterator.Count <= 0) continue; 

l_iterator.Count等於0,但它必須等於1
什麼是錯我的XPath的選擇?
任何幫助將不勝感激。

回答

3

這是因爲FORM標籤有一個特殊的HTML敏捷包處理。原因描述如下:HtmlAgilityPack -- Does <form> close itself for some reason?

所以,你基本上需要刪除特殊處理,像這樣的(必須發生之前的任何負載):

// instruct the library to treat FORM like any other tag 
HtmlNode.ElementsFlags.Remove("form"); 

HtmlDocument l_missionsDoc = new HtmlDocument(); 
l_missionsDoc.Load(l_stream); 

XPathNavigator l_navigator = l_missionsDoc.CreateNavigator(); 
XPathNodeIterator l_iterator = l_navigator.Select("//form[@id='formliste']/table"); 

if (l_iterator.Count <= 0) continue;