2017-01-10 23 views
0

在这个问题上,假设第一个点之前的起始节点是.DocumentNode,类型HtmlAgilityPack.HtmlDocumentHtmlAgilityPack如何通配符搜索选择最后一个子

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

我需要的结果是只包含“Year Interior:”的最后一个孩子:

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

我正在搜索的Html不一致。 “年份内部:”可能在<li>,<span>,<td>,<div>, etc.,这就是为什么我不能在搜索中更明确。

.SelectSingleNode("*[contains(.,'Year Interior:')]")这样的东西怎么会只返回最后一个包含“Year Interior:”的子元素而不是容器元素?

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

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

UPDATE: 尝试以下是啰嗦,靠近工作除了它捕获格式的标记,如<strong><em>

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

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

回答

1

如何:

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

我更新根据您提出的答案的问题,筛选后代。它更接近。 – STWilson

+0

所以你不想格式化标签或你做? –

+0

如果你不想要,你可以将这个条件添加到Where语句'&& _.Name.Equals(HtmlNodeType.Text)' –