извлечение только текста страницы с помощью HTMLAgilityPack

Хорошо, поэтому я действительно новичок в запросах XPath, используемых в HTMLAgilityPack.

Итак, давайте рассмотрим эту страницу http://health.yahoo.net/articles/healthcare/what-your-favorite-flavor-says-about-you. Я хочу извлечь только содержимое страницы и ничего больше.

Для этого я сначала удаляю теги скриптов и стилей.

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.

Пожалуйста, мне нужно небольшое руководство по этому поводу.


person Win Coder    schedule 13.10.2013    source источник
comment
если вам нужны только конкретные данные, вам нужно сказать, из какой заметки, потому что вы берете текст отовсюду.   -  person Darka    schedule 13.10.2013
comment
@Darka В основном я пытаюсь создать веб-краулер для своей поисковой системы. Поэтому я хочу получать полезный текст из любого места на веб-странице. В частности, я хотел бы получить все теги ‹p›, соответствующие их содержательной ценности.   -  person Win Coder    schedule 13.10.2013


Ответы (2)


Если вы считаете, что узлы script и style имеют только текстовые узлы для дочерних узлов, вы можете использовать это выражение XPath для получения текстовых узлов, не содержащихся в тегах script или style, так что вам не нужно удалять узлы заранее:

//*[not(self::script or self::style)]/text()

Вы также можете исключить текстовые узлы, состоящие только из пробелов, используя XPath normalize-space():

//*[not(self::script or self::style)]/text()[not(normalize-space(.)="")]

или короче

//*[not(self::script or self::style)]/text()[normalize-space()]

Но вы все равно получите текстовые узлы, которые могут иметь начальные или конечные пробелы. Это можно сделать в вашем приложении, как предлагает @ aL3891.

person paul trmbrth    schedule 13.10.2013

Если \r \n символов в последней строке является проблемой, вы можете просто удалить их постфактум:

TempString.ToString().Replace("\r", "").Replace("\n", "");
person aL3891    schedule 13.10.2013