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

时间:2015-05-04 14:50:28

标签: c# html winforms html-agility-pack

我想提取文字"有些文字在这里"在div类之间。 我正在使用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' 

我知道如果文字是短信<h1><p>而不是&#34; div&#34;在后代,我将不得不给#34; h1&#34;或&#34; p&#34;。

有人请你协助。

2 个答案:

答案 0 :(得分:1)

使用单引号,例如

//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()]

答案 1 :(得分:1)

如果从您发布的HTML代码段创建doc,则无法获得空引用异常。无论如何,如果您想在外部<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);

..此表达式仅返回外部<div>的文本:

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

..而相反,以下返回所有文字:

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