Node的内部文本忽略了孩子的内部文本

时间:2013-02-03 21:26:29

标签: c# xpath html-agility-pack

请原谅我,如果这听起来太简单了,但是因为这是我使用html-agility-pack的第一天,我无法找到一种方法来选择直接子节点的内部文本节点和忽略子节点的内部文本。

例如

<div id="div1">
   <div class="h1"> this needs to be selected
   <small> and not this</small>
   </div>
</div>

目前我在尝试这个

HtmlDocument page = new HtmlWeb().Load(url);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']");
string selText = s.innerText;

返回整个文本(例如,这需要选择而不是这个)。 有什么建议??

2 个答案:

答案 0 :(得分:3)

div如果在其子项之前和之后有文本,则可能有多个文本节点。正如我同样指出here,我认为获取节点的所有直接文本内容的最佳方法是执行以下操作:

HtmlDocument page = new HtmlWeb().Load(url);
var nodes = page.DocumentNode.SelectNodes("//div[@id='div1']//div[@class='h1']/text()");

StringBuilder sb  = new StringBuilder();
foreach(var node in nodes)
{
   sb.Append(node.InnerText);
}

string content = sb.ToString();

答案 1 :(得分:2)

您可以使用/text()选项直接在特定标记下获取所有文本节点。如果您只需要第一个,请为其添加[1]

page.LoadHtml(text);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']/text()[1]");
string selText = s.InnerText;