2012-03-02 79 views
1

我想用HTML敏捷包解析這個HTML頁面,但我似乎無法讓它按預期工作。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" lang="de-ch" xml:lang="de-ch"> 
<head> 
</head> 
<body id="Adressservices"> 
    <div id="page"> 
     <div id="page-544"> 
      <table class="full"> 
       <thead> 
        <tr> 
         <th class="first" scope="col" style="width: 18%;">Type</th> 
         <th class="col" style="width: 20%;">Name</th> 
         <th class="col">Date</th> 
         <th class="col" style="text-align: right; width: 10%;">Size</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr> 
         <td class="first">Change</td> 
         <td><a href="/download?file=5210044">somefile01.zip</a></td> 
         <td style="width: 5%;"><b class="filesize">2012-03-01</b></td> 
         <td style="text-align: right;"><b class="filesize">881.00</b></td> 
        </tr> 
        <tr> 
         <td class="first">Change</td> 
         <td><a href="/download?file=7610042">somefile02.zip</a></td> 
         <td style="width: 5%;"><b class="filesize">2012-02-01</b></td> 
         <td style="text-align: right;"><b class="filesize">1400.00</b></td> 
        </tr> 
        <tr>.....</tr> 
       </tbody> 
      </table> 
     </div> 
    </div> 
</body> 
</html> 

真正的頁面有不少更<tr>....</tr>行。

我能下載頁面只是使用HTML敏捷性包此代碼段罰款:

HtmlWeb web = new HtmlWeb(); 
HtmlDocument archiveDoc = web.Load(_archiveUrl); 
var tables = archiveDoc.DocumentNode.SelectNodes("//table"); 

所以我得到一個處理我的<table>元素上,工作得很好。

現在,我試圖從該表中得到第一<tr>元素,我想這一點:

HtmlNode node = tables[0]; 
var allTRNodes = node.SelectNodes("tbody/tr"); 
var firstTR = allTRNodes[0]; 

在這裏,我沒有收到<tr>節點如預期的N - 但只有兩個。和第一那些不包含類型<td>要麼...

然後我嘗試的LINQ TO-「HTML」 Y的子節點的列表:

HtmlNode node = tables[0]; 
var firstTR = node.Element("tbody").Element("tr"); 

但同樣:我沒有得到含<td>類型Y的子節點列表中的第一<tr>節點要麼...

試圖讓第一<tr>內的所有<td>節點列表中也沒有完全按預期工作:

HtmlNode node = tables[0]; 
var allTDNodes = node.SelectNodes("tbody/tr/td"); 
var firstTD = allTDNodes[0]; 

而不是預期的y <td>節點,我只得到三個子節點 - 兩個#text,最後一個類型爲<td> - 爲什麼?

好像HTML敏捷性包被曲解<td>節點列表嵌套的節點......

任何想法?思考?提示如何解決這個問題?

+1

很奇怪。用你的HTML例子'allTRNodes'有3個'tr'節點(最後一個是...); 'allTDNodes'在我身邊有8個'td'節點(HtmlAgilityPack v2.0.50727)。還有一個假設 - 也許你在示例中沒有包含的HTML代碼被破壞了? – Alex 2012-03-02 10:27:28

+0

同樣在這裏,最新的HAP穩定下載。 – Oded 2012-03-02 10:37:36

+0

@Alex:是的,'allTDNodes'在我的「真實」樣本中有60多個元素 - 這只是令人困惑 - 我假設如果我從給定的'trNode'開始,我會得到所有**子節點**該節點 - 不是來自整個文檔的所有**節點! – 2012-03-02 12:37:50

回答

2

使用後代如下例:

var linkNode = doc.DocumentNode.SelectSingle("//div[@id=\"content-wrapper\"]/dl/dd"); 
var hrefNode = linkNode.SelectSingleNode("descendant::a"); 

東西我不同意HtmlAgility包從頂部是node.SelectNode *呼叫遍歷DOM,而不是從當前節點

這裏收養的樣品你的情況

// table 
var tableNode = docNode.SelectSingleNode("//table"); 
// first tr 
var trNode = tableNode.SelectSingleNode("descendant::tr"); 

// you can also try, but it's overkill 
var trNode1 = tableNode.SelectSingleNode("descendant::tr[0]"); 

// then your td 
var tdNode = trNode.SelectSingleNode("descendant::td"); 
+0

我剛剛在node.selectNode遍歷整個文檔時遇到類似的問題。我希望將來有所改變。 – 2014-02-07 18:33:59

+0

逸WUD是因爲每個AgilityPack用戶將不得不改到新行爲的代碼壞主意......我想軟件,只要它如果不是之前出廠的成爲傳統... – b0rg 2014-02-11 11:34:16