Как извлечь текст внутри тега div, используя htmlagilitypack

c# html html-agility-pack winforms

Вопрос

Я хочу извлечь текст «Некоторые тексты здесь» между div-классом. Я использую html agility pack и 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 / wa <h1> или <p> вместо «div» в Descendants мне нужно будет дать «h1» или «p».

Кто-нибудь, пожалуйста, помогите.

Принятый ответ

Используйте одинарные кавычки, такие как

//div[@class='productDescriptionWrapper']

чтобы использовать всех потомков всех типов:

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

для получения всех потомков определенного типа, например p используйте //div[@class='productDescriptionWrapper']//p .

чтобы получить всех потомков, которые являются либо div либо p :

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

... это выражение возвращает текст только из внешнего <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"


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow