如何使用htmllagilitypack解析这个HTML文本

本文关键字:HTML 文本 何使用 htmllagilitypack | 更新日期: 2023-09-27 18:11:26

下面是行代码

    <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]

有人知道怎么让这个工作吗?
提前谢谢你。

如何使用htmllagilitypack解析这个HTML文本

  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

        }
  }         

看起来你想要所有<td>标签的InnerText类属性为"line1left",除非<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#代码来去掉单个值上不需要的格式