【问题标题】:Anglesharp normalize / fix htmlAnglesharp 规范化/修复 html
【发布时间】:2019-10-04 13:57:38
【问题描述】:

我有这段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 放入段落中

【问题讨论】:

  • Florian,AngleSharp 的作者之一,是一个了不起的支持者。为什么不在 AngleSharp GitHub 存储库上open an issue
  • 感谢 Uwe - 非常感谢!确实,我对 SO 的看法不是很积极,但我很高兴您将他指向 GH,在那里我设置了各种通知。

标签: c# html parsing anglesharp


【解决方案1】:

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 - 因此可能会进行进一步的操作(不仅仅是序列化)。

希望有帮助!

【讨论】:

  • 很棒的支持,弗洛里安?
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2012-05-22
  • 2012-04-24
  • 1970-01-01
相关资源
最近更新 更多