Нормализовать пространство в HtmlAgilityPack - PullRequest
0 голосов
/ 14 сентября 2018

Вот фрагмент HTML. Как я могу получить текст нормализованного пространства?

Для поиска того же фрагмента, но с использованием Xpath //*[normalize-space()='Text1 Text2']

<div>
    <div>
        <a></a>
        <a></a>
        <div><a><span></span>Text2</a></div>
    </div>
        <div>Text2</div>
</div>

Использование:

var htmlNodes = htmlDoc.DocumentNode.SelectNodes("*");

foreach (var node in htmlNodes)
{
   text += node.InnerText;
}

Я получаю эту строку:

"\r\n                        \r\n                        \r\n                        \r\n                        \r\n                        Text1\r\n                    Text2"

Можно ли получить нормальный текст?

"Text1 Text2"

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Если вы уже находитесь в нужном узле и не возражаете, все пробелы превращаются в один пробел:

var htmlNodes = htmlDoc.DocumentNode.InnerText;
var normalized = Regex.Replace(htmlNodes.Trim(), @"\s+", " ");

Поиск в листовых узлах,это сохранит пробелы в непробелах внутри элемента без изменений (например, если у вас было <div><a><span></span>this needs space</a></div>):

var leafNodes = htmlDoc.DocumentNode.Descendants()
    .Where(x => !x.ChildNodes.Any());
var trimmedInnerText = leafNodes.Select(x => x.InnerText.Trim())
    .Where(x => !string.IsNullOrEmpty(x));
var outputString = string.Join(" ", trimmedInnerText);
0 голосов
/ 14 сентября 2018

Вместо этого можно использовать свойство InnerText:

var texts = document.DocumentNode.Descendants("div").Select(n => n.InnerText);

И объединить их, если хотите:

var combined = string.Join(" ", texts);

Чтобы отфильтровать пустые значения:

.Select(n => n.InnerText.Replace("\r\n", "")).Where(s => !string.IsNullOrEmpty(s));
...