2015-09-07 199 views
0

所以下面是行代碼如何使用htmlagilitypack解析HTML文本?

<td class="line1left"><a href="scenario_WLM-16-SCENARIOS.html#population_SCN02_MS_AddNotes_CAM">SCN02_MS_AddNotes_CAM</a></td><td class="line1left">798 (6.14%) 
    </td><td class="line1left">0.9</td><td class="line1left">0s (<span> - %</span>) 
    </td><td class="line1left">0% (<span class="goodPercentage">-100%</span>) 
    </td> 

    <td class="line1left"><a href="scenario_WLM-16-SCENARIOS.html#population_SCN05_MS_UpdateCustomer_CAM">SCN05_MS_UpdateCustomer_CAM</a></td><td class="line1left">888 (6.83%) 
    </td><td class="line1left">1.0</td><td class="line1left">0s (<span> - %</span>) 
    </td><td class="line1left">0% (<span class="goodPercentage">-100%</span>) 
    </td> 

從第一塊,我需要得到SCN02_MS_AddNotes_CAM798。要獲得798我正在使用此代碼,但我也得到了(6.14%),我不想要。

var content1 = doc1.DocumentNode.SelectNodes("//td[@class='line1left']")[1].InnerText; 

我只想得到798。那麼有人能幫助我嗎?

我也想知道如何從第二個塊獲得相同的值。我的印象是,括號內的數字表示類別line1left的不同事件。但在這裏它代表不同的InnerHtml元素。

[1] 

有沒有人知道如何讓這個工作?
非常感謝。

回答

0
var line1left_list = (from d in document.DocumentNode.Descendants() 
           where d.Name == "td " && d.Attributes["class"] != null 
           && (d.Attributes["class"].Value == "line1left") 
           select d); 

    foreach (HtmlNode line1left in line1left_list) 
    { 
     var _link = line1left.Descendants("a").FirstOrDefault(); 

     string linkUrl = ""; 
     string link = ""; 

     if (_link != null) 
     { 
      linkUrl = _link.Attributes["href"].Value; 
      link = _link.InnerText 


     } 
    }   
+0

如果「798」總是出現在鏈接之後,那麼可以試試這個_link.Descendants()並獲取第一個HtmlNode的內部文本。 – Melad

+0

最後一行「link = _link.InnerText;」總是給我line1left最後(第二個)塊的InnerText值。我如何獲得第一個區塊和所有區塊之間的價值? – crossemup

+0

您可以創建一個字符串數組並添加所有的鏈接。 – Melad

0

它看起來像你希望所有<td>標籤與「line1left」的類屬性將InnerText,除非<td><a>它內部的,在這種情況下,你想要的<a>的innerText屬性。

這是一個可以做到這一點的例子。如果<td>具有<a>,則選擇<a>,否則選擇<td>

HtmlDocument doc1 = new HtmlDocument(); 
doc1.Load("xmlfile2.xml"); 

var nodes = doc1.DocumentNode.SelectNodes("(//td[@class='line1left']/a) | (//td[@class='line1left' and not(a)])"); 

foreach(var node in nodes) 
    Console.WriteLine(node.InnerText.Trim()); 

這將選擇文檔中的所有節點。您可以使用常規的C#代碼去除各個值上不需要的格式。