HtmlAgilityPack如何选择通配符搜索中的最后一个孩子

时间:2017-01-10 12:27:42

标签: html powershell html-agility-pack

在这个问题中,假设第一个点之前的起始节点是.DocumentNode,输入HtmlAgilityPack.HtmlDocument

.SelectSingleNode("*[contains(.,'Year Interior:')]")

结果:

InnerHtml:<table width="822" height="173" class="diy-section-content-table adSpecView-section-content-body-container" border="1" cellspacing="0" cellpadding="0"><tbody><tr><td class="diy-section-content-table-td diy-template-column" valign="top"><ul><li><strong>Year Interior:</strong>2007</li><li>Good Condition</li></ul></td></tr></tbody>

我需要结果只是包含&#34;年内容的最后一个孩子:&#34;:

<li><strong>Year Interior:</strong>2007</li>

我搜索的Html不一致。 &#34;年度内部:&#34;可能在<li>,<span>,<td>,<div>, etc.,这就是我在搜索中无法更明确的原因。

.SelectSingleNode("*[contains(.,'Year Interior:')]")这样的内容怎么会只返回包含&#34;年内容的最后一个孩子:&#34;而不是容器元素?

当然,我不能这样做,但它显示了我需要的结果: .SelectSingleNode("*/*/*/*/*/*/*[contains(.,'Year Interior:')]")

所需结果:InnerHtml:<strong>Year Interior:</strong> 2007

更新: 尝试以下操作是冗长的,接近工作,除了它捕获格式标记,如<strong><em>

.Descendants() | Where-Object {$_.InnerHtml -like "*Year Interior:*" -and $_.HasChildNodes -eq $false}).ParentNode

在这种情况下,第一个父节点是强标记,因此代码将变得更加难以检查它是否是格式化标记。

1 个答案:

答案 0 :(得分:1)

这个怎么样:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
doc.DocumentNode.Descendants().Where(_ => !string.IsNullOrEmpty(_.InnerText) && _.InnerText.Trim().Equals("Year Interior:"));