Итак, я действительно новичок в запросах XPath, используемых в HTMLAgilityPack.
Итак, давайте рассмотрим эту страницу http://health.yahoo.net/articles/healthcare/what-your-favorite-flavor-says-about-you . Что я хочу, это извлечь только содержимое страницы и ничего больше.
Так что для этого я сначала удаляю теги script и style.
Document = new HtmlDocument();
Document.LoadHtml(page);
TempString = new StringBuilder();
foreach (HtmlNode style in Document.DocumentNode.Descendants("style").ToArray())
{
style.Remove();
}
foreach (HtmlNode script in Document.DocumentNode.Descendants("script").ToArray())
{
script.Remove();
}
После этого я пытаюсь использовать // text (), чтобы получить все текстовые узлы.
foreach (HtmlTextNode node in Document.DocumentNode.SelectNodes("//text()"))
{
TempString.AppendLine(node.InnerText);
}
Однако не только я получаю не только текст, но и множество символов / r / n.
Пожалуйста, мне нужно небольшое руководство в этом отношении.
Если вы считаете, что узлы script
и style
имеют только текстовые узлы для детей, вы можете использовать это выражение XPath для получения текстовых узлов, которые не находятся в тегах script
или style
, так что вам не нужно заранее удалять узлы:
//*[not(self::script or self::style)]/text()
Вы также можете исключить текстовые узлы, которые являются только пробелами, с помощью normalize-space()
XPath:
//*[not(self::script or self::style)]/text()[not(normalize-space(.)="")]
или короче
//*[not(self::script or self::style)]/text()[normalize-space()]
Но вы все равно получите текстовые узлы, которые могут иметь пробелы в начале или конце. Это можно использовать в вашем приложении, как предлагает @ aL3891.