如何使用 htmlagilitypack 解析这个 HTML 文本?

Posted

技术标签:

【中文标题】如何使用 htmlagilitypack 解析这个 HTML 文本?【英文标题】:How to parse this HTML text using htmlagilitypack? 【发布时间】:2015-12-02 19:04:41 【问题描述】:

下面是代码行

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

有人知道如何让它工作吗? 提前非常感谢!

【问题讨论】:

【参考方案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


        
           

【讨论】:

如果“798”总是出现在链接之后,你可以试试这个 _link.Descendants() 并获取第一个 HtmlNode 的内部文本。 最后一行“link = _link.InnerText;”总是给我 line1left 的最后一个(第二个)块的 InnerText 值。我如何获得第一个块和中间所有块的值? 您可以创建一个字符串数组并将所有链接添加到其中。【参考方案2】:

看起来您想要所有 &lt;td&gt; 标记的 InnerText,其类属性为“line1left”,除非 &lt;td&gt; 在其中包含 &lt;a&gt;,在这种情况下您想要 &lt;a&gt; 的 InnerText .

这是一个可以做到这一点的例子。如果&lt;td&gt;&lt;a&gt;,则选择&lt;a&gt;,否则选择&lt;td&gt;

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# 代码去除各个值上不需要的格式。

【讨论】:

以上是关于如何使用 htmlagilitypack 解析这个 HTML 文本?的主要内容,如果未能解决你的问题,请参考以下文章

html解析组件htmlagilitypack如何解析指定的网页

忽略解析错误 HTMLAgilityPack?

InnerText=InnerHtml - 如何使用 HtmlAgilityPack 提取可读文本

使用 HtmlAgilitypack 问题解析表

HTML 解析类库HtmlAgilityPack

C# HTML解析工具HtmlAgilityPack使用实例