Wie man Text innerhalb eines div Tags mit htmlagilitypack extrahiert

c# html html-agility-pack winforms

Frage

Ich möchte den Text "Irgendein Text geht hier" zwischen der Div-Klasse extrahieren. Ich verwende html Agility Pack und c #

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

Das ist was ich habe:

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

Ich bekomme diesen Fehler:

An unhandled exception of type 'System.NullReferenceException' 

Ich weiß, wie man extrahiert, wenn der Text b / wa <h1> oder <p> anstelle von "div" in Descendants ist, ich muss "h1" oder "p" geben.

Jemand bitte assistieren.

Akzeptierte Antwort

Verwenden Sie einfache Anführungszeichen wie z

//div[@class='productDescriptionWrapper']

Um alle Nachkommen aller Typen zu erhalten, benutze:

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

Um alle Nachkommen eines bestimmten Typs wie p benutze //div[@class='productDescriptionWrapper']//p .

um alle Nachkommen zu erhalten, die entweder ein div oder ein p :

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

Sagen Sie, dass Sie alle nicht leeren Nachfolgertextknoten erhalten möchten, und verwenden Sie dann:

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

Beliebte Antwort

Es gibt keine Möglichkeit, eine Nullreferenzausnahme zu erhalten, wenn das doc aus dem von Ihnen geposteten HTML-Code erstellt wurde. Wie auch immer, wenn Sie Text innerhalb des äußeren <div> , aber nicht vom inneren bekommen wollten, dann benutzen Sie xpath /text() was bedeutet, dass Sie direkt untergeordnete Textknoten bekommen .

Zum Beispiel, angesichts dieses HTML-Snippets:

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

..dieser Ausdruck gibt nur Text aus dem äußeren <div> :

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

..im Gegensatz dazu geben die folgenden den gesamten Text zurück:

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum