2014-02-14 41 views
0

我試圖使用HtmlAgilityPack解析通過網頁的HTML解析出表/行的單元格。使用HtmlAgilityPack解析帶有標題,表格,行,單元格的HTML

代碼示例幾乎可以工作,除了我在Table集合上遇到異常。我認爲這可能與Header沒有格式化爲集合有關(我無法修改HTML的源代碼)。

請幫助代碼,或請建議替代方案或變通方法。

結構是: 頭 - >表 - >行 - >細胞

有集管的集合(包含日期),包含表,其包含的行的集合的集合,並行包含一組單元格。

string html = @" 
<html> 
<body> 
<h3>February 8, 2014</h3>  
    <table> 
     <tr> 
      <td><b>Site</b></td> 
      <td><b>ColumnA</b></td> 
      <td><b>ColumnB</b></td> 
      <td><b>ColumnC</b></td> 
     </tr> 
     <tr> 
      <td>SiteA</td> 
      <td>3</td> 
      <td>6</td> 
      <td>3</td> 
     </tr> 
     <tr> 
      <td>SiteB</td> 
      <td>4</td> 
      <td>6</td> 
      <td>2</td> 
     </tr> 
     <tr> 
      <td>SiteC</td> 
      <td>4</td> 
      <td>9</td> 
      <td>4</td> 
     </tr> 
    </table> 
<h3>February 7, 2014</h3>  
    <table> 
     <tr> 
      <td><b>Site </b></td> 
      <td><b>ColumnA</b></td> 
      <td><b>ColumnB</b></td> 
      <td><b>ColumnC</b></td> 
      </tr> 
     <tr> 
      <td>SiteA</td> 
      <td>2</td> 
      <td>4</td> 
      <td>1</td> 
     </tr> 
     <tr> 
      <td>SiteB</td> 
      <td>1</td> 
      <td>1</td> 
      <td>2</td> 
     </tr> 
     <tr> 
      <td>SiteC</td> 
      <td>2</td> 
      <td>6</td> 
      <td>1</td> 
     </tr> 
    </table> 
</body> 
</html> 
"; 

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
foreach (HtmlNode header in doc.DocumentNode.SelectNodes("//h3")) 
{ 
    string headerDate = header.InnerText; 

    foreach (HtmlNode table in header.SelectNodes("table")) //System.NullReferenceException 
    { 
     foreach (HtmlNode row in table.SelectNodes("tr")) 
     { 
      Console.Write(headerDate); 
      foreach (HtmlNode cell in row.SelectNodes("td")) 
      { 
       Console.Write("\t" + cell.InnerText); 
      } 
      Console.WriteLine(); 
     } 
    } 
} 

預期結果:

February 8, 2014 Site ColumnA ColumnB ColumnC 
February 8, 2014 SiteA 3 6 3 
February 8, 2014 SiteB 4 6 2 
February 8, 2014 SiteC 4 9 4 
February 7, 2014 Site ColumnA ColumnB ColumnC 
February 7, 2014 SiteA 2 4 1 
February 7, 2014 SiteB 1 1 2 
February 7, 2014 SiteC 2 6 1 

謝謝。傑克。

+1

*「代碼示例幾乎可用」*,請提供您的代碼示例。 – Harrison

回答

0

您正在遍歷標題,就好像您希望表格位於標題標記內一樣,但表格標題中的而不是,儘管誤導的縮進似乎暗示了這一點。標題標籤是兄弟姐妹的表格,而不是父母

<h3>February 8, 2014</h3> <-- </h3> closes the header tag 
<table>     <-- this is the next element at the same level, not a child 
    <tr> 
     <td><b>Site</b></td> 
     <td><b>ColumnA</b></td> 
     <td><b>ColumnB</b></td> 
     <td><b>ColumnC</b></td> 
    </tr> 
</table> 

請記住,縮進/空格在html中沒有意義。這是所有規則的標籤。