【问题标题】:Inner text of Node ignoring inner text of children节点的内部文本忽略子级的内部文本
【发布时间】:2013-02-03 21:26:29
【问题描述】:

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

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

【问题讨论】:

    标签: c# xpath html-agility-pack


    【解决方案1】:

    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();
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多