2013-02-27 5 views
1

Я занимаюсь разработкой консольного приложения .Net.
Я хочу запросить HTML-страницу, а затем забрать некоторые данные внутри.
Я использую Html Agility Pack для создания объектной модели с HTML-страницы ответа и для выбора узлов с помощью xPath.Html Agility Pack xPath issue

Вот выдержка из ответа страницы 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 имеет специальное обращение с помощью пакета Agility Pack. Причины описаны здесь: 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;