Anglesharp нормализовать / исправить HTML - PullRequest
0 голосов
/ 17 мая 2019

У меня есть этот кусок HTML

<div>
  Outside paragraph
  <p>In paragraph</p>
</div>

Как видите, есть Outside paragraph фрагмент текста, который, будучи вне абзаца, не является нужной ситуацией.

Существует ли какой-либо метод AngleSharp (если не Anglesharp, а затем любой другой), который позволил бы мне нормализовать / исправить этот фрагмент HTML, чтобы он выглядел следующим образом:

<div>
  <p>Outside paragraph</p>
  <p>In paragraph</p>
</div>

Итак, фрагмент кода, который вставит Outside paragraph в параграф

1 Ответ

2 голосов
/ 17 мая 2019

AngleSharp не предоставляет такой пользовательской логики, но дает вам возможность развернуть свои собственные схемы нормализации.

В следующем примере я использую TreeWalker для упрощения итерации только по текстовым узлам.

Код ищет заданные условия для динамической вставки абзаца.

var context = BrowsingContext.New();
var document = await context.OpenAsync(res => res.Content("foo<div>Outside<p>Inside</p></div>bar"));
var walker = document.CreateTreeWalker(document.Body, AngleSharp.Dom.FilterSettings.Text);

while (walker.ToNext() != null)
{
    var current = walker.Current;

    // if just whitespace, e.g., formatting line breaks, or in p anyway - skip
    if (
        (current.TextContent.Trim().Length == 0) ||
        (current.ParentElement.LocalName == "p"))
    {
        continue;
    }
    // if next to paragraph perform the normalization
    else if (
        (current.PreviousSibling is IElement previous && previous.LocalName == "p") ||
        (current.NextSibling is IElement next && next.LocalName == "p"))
    {
        var newNode = document.CreateElement("p");
        current.ReplaceWith(newNode);
        newNode.Append(current);
    }
}

document.Body.ToHtml().Dump();

Полученный результат выглядит следующим образом:

<body>foo<div><p>Outside</p><p>Inside</p></div>bar</body>

Это потенциально не все , что вам нужно, но должно дать вам указатель в правильном направлении.

Примечание : Вы также можете выполнить собственную (рекурсивную) итерацию или использовать, например, пользовательский IMarkupFormatter, чтобы выполнить нормализацию в качестве сериализации. Есть несколько способов. Данный изменяет DOM - так как такие дальнейшие операции (не только сериализация) могут быть возможны.

Надеюсь, это поможет!

...