2016-02-16 148 views
3

解析HTML我有一個HTML解析(見下文)使用敏捷包

<div id="mailbox" class="div-w div-m-0"> 
    <h2 class="h-line">InBox</h2> 
    <div id="mailbox-table"> 
     <table id="maillist"> 
      <tr> 
       <th>From</th> 
       <th>Subject</th> 
       <th>Date</th> 
      </tr> 
      <tr onclick="location='readmail.html?mid=welcome'" style="font-weight: bold;"> 
       <td>[email protected]</td> 
       <td> 
        <a href="readmail.html?mid=welcome">Hi, Welcome</a> 
       </td> 
       <td> 
        <span title="2016-02-16 13:23:50 UTC">just now</span> 
       </td> 
      </tr> 
      <tr onclick="location='readmail.html?mid=T0wM6P'" style="font-weight: bold;"> 
       <td>[email protected]</td> 
       <td> 
        <a href="readmail.html?mid=T0wM6P">sa</a> 
       </td> 
       <td> 
        <span title="2016-02-16 13:24:04">just now</span> 
       </td> 
      </tr> 
     </table> 
    </div> 
</div> 

我需要解析<tr onclick=標籤鏈接和電子郵件地址在<td>標籤。

到目前爲止,我管理從我的HTML第一次發生電子郵件/鏈接。

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(responseFromServer); 

有人能告訴我它是如何正確完成的嗎?基本上我想要做的是從所有標籤中的html中獲取所有的電子郵件地址和鏈接。

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]")) 
{ 
    HtmlAttribute att = link.Attributes["onclick"]; 
    Console.WriteLine(att.Value); 
} 

編輯:我需要將分析的值成對存儲在類(列表)中。電子郵件(鏈接)和發件人電子郵件。

public class ClassMailBox 
{ 
    public string From { get; set; } 
    public string LinkToMail { get; set; }  

} 
+0

我也試過HtmlAgilityPack,但它不支持XPath。 – Fab

+0

您是否嘗試過CssPath功能? – Fab

+1

@Tagyoureit我想你的代碼,並打印出兩個TR項目: 位置= '?readmail.html中旬=歡迎' 位置= '?readmail.html中旬= T0wM6P' 我使用.NET 4.5和HtmlAgilityPack 1.4.9。你能否檢查你在responseFromServer變量中獲得的html是否完整。 謝謝 – avenet

回答

2

你可以寫下面的代碼:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(responseFromServer); 

foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//tr[@onclick]")) 
{ 
    HtmlAttribute att = link.Attributes["onclick"]; 
    ClassMailBox classMailbox = new ClassMailBox() { LinkToMail = att.Value }; 
    classMailBoxes.Add(classMailbox); 
} 

int currentPosition = 0; 

foreach (HtmlNode tableDef in doc.DocumentNode.SelectNodes("//tr[@onclick]/td[1]")) 
{ 
    classMailBoxes[currentPosition].From = tableDef.InnerText; 
    currentPosition++; 
} 

爲了保持代碼的簡單,我假設一些事情:

  1. 電子郵件總是在內部首款TD tr其中包含一個onlink屬性
  2. 每個帶有onlink屬性的tr都包含一個電子郵件

如果這些條件不適用,這段代碼將不起作用,它可能會拋出一些異常(IndexOutOfRangeExceptions),或者它可能與具有錯誤電子郵件地址的鏈接匹配。

+0

是的,它像一個魅力。謝謝你的時間!你的假設是正確的(1和2)。 – Tagyoureit