如何使用htmlagilitypack解析HTML文本?

问题描述:

所以下面是行代码如何使用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] 

有没有人知道如何让这个工作?
非常感谢。

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

它看起来像你希望所有<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#代码去除各个值上不需要的格式。