如何使用 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_CAM
和798
。要获得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】:看起来您想要所有 <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# 代码去除各个值上不需要的格式。
【讨论】:
以上是关于如何使用 htmlagilitypack 解析这个 HTML 文本?的主要内容,如果未能解决你的问题,请参考以下文章
html解析组件htmlagilitypack如何解析指定的网页