2015-09-07 1 views
0

Так ниже приведены строки кода,Как проанализировать этот HTML-текст с помощью htmlagilitypack?

<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_CAM и 798. Чтобы получить 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;" всегда дает мне значение InnerText последнего (второго) блока line1left. Как получить значение первого блока и всех блоков между ними? – crossemup

+0

Вы можете создать массив строк и добавить все ссылки на него. – Melad

0

Похоже, что вы хотите InnerText всех <td> тегов с атрибутом класса из «line1left», если это <td> не имеет <a> внутри него, в случае чего вы хотите в InnerText из <a>.

Вот пример, который будет делать именно это. Если <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#, чтобы отключить нежелательное форматирование по отдельным значениям.