Я хочу извлечь текст «Некоторые тексты здесь» между 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"