3

如果这听起来太简单以至于在这里被问到,请原谅我,但由于这是我使用 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;

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

4

2 回答 2

3

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

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();
于 2013-02-04T03:40:41.413 回答
2

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

page.LoadHtml(text);
var s = page.DocumentNode.SelectSingleNode("//div[@id='div1']//div[@class='h1']/text()[1]");
string selText = s.InnerText; 
于 2013-02-03T23:35:42.793 回答