如何使用 htmlagilitypack 提取 div 标签内的文本

How to extract text inside a div tag using htmlagilitypack

我想提取 div class 之间的文本 "Some text goes here"。 我正在使用 html 敏捷包和 c#

<div class="productDescriptionWrapper">
Some Text Goes here...
<div class="emptyClear"> </div>
</div>

这就是我所拥有的:

Description = doc.DocumentNode.SelectNodes("//div[@class=\"productDescriptionWrapper\").Descendants("div").Select(x => x.InnerText).ToList();

我收到这个错误:

An unhandled exception of type 'System.NullReferenceException' 

我知道如何提取如果文本是 b/w 一个 <h1><p> 而不是 "div" 在后代我将不得不给 "h1"或 "p".

有人请帮忙。

使用单引号如

//div[@class='productDescriptionWrapper']

获取所有类型的所有后代使用:

//div[@class='productDescriptionWrapper']//*,

获取特定类型的所有后代 例如 p 然后使用 //div[@class='productDescriptionWrapper']//p.

获取所有 divp 的后代:

//div[@class='productDescriptionWrapper']//*[self::div or self::p] 

假设您想获得所有非空白后代文本节点,然后使用:

//div[@class='productDescriptionWrapper']//text()[normalize-space()]

鉴于 doc 是根据您发布的 HTML 片段创建的,您无法获得空引用异常。无论如何,如果您打算在外部 <div> 中获取文本,而不是从内部获取文本,则使用 xpath /text(),这意味着 获取直接子文本节点

例如,给定这个 HTML 片段:

var html = @"<div class=""productDescriptionWrapper"">
Some Text Goes here...
<div class=""emptyClear"">Don't get this one</div>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(html);

..此表达式 return 仅来自外部 <div> 的文本:

var Description = doc.DocumentNode
                     .SelectNodes("//div[@class='productDescriptionWrapper']/text()")
                     .Select(x => x.InnerText.Trim())
                     .First();
//Description : 
//"Some Text Goes here..."

..而相比之下,以下return全文:

var Description = doc.DocumentNode
                     .SelectNodes("//div[@class='productDescriptionWrapper']")
                     .Select(x => x.InnerText.Trim())
                     .First();
//Description :
//"Some Text Goes here...
//Don't get this one"