首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anglesharp规范化/修复html

Anglesharp规范化/修复html
EN

Stack Overflow用户
提问于 2019-05-17 08:56:40
回答 1查看 705关注 0票数 0

我有这段html

代码语言:javascript
复制
<div>
  Outside paragraph
  <p>In paragraph</p>
</div>

正如你所看到的,有一个Outside paragraph文本,在段落之外,是不需要的情况。

是否有任何AngleSharp方法(如果不是Anglesharp,那么还有其他方法)允许我对这段html进行规范化/修复,这样看起来如下:

代码语言:javascript
复制
<div>
  <p>Outside paragraph</p>
  <p>In paragraph</p>
</div>

所以,一段将Outside paragraph放入段落的代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 13:53:03

AngleSharp没有提供这样的自定义逻辑,但它为您提供了推出您自己的规范化方案的手段。

在下面的示例中,我使用TreeWalker来简化仅对文本节点的迭代。

代码寻找动态插入段落的给定条件。

代码语言:javascript
复制
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();

倾弃的结果如下:

代码语言:javascript
复制
<body>foo<div><p>Outside</p><p>Inside</p></div>bar</body>

这可能不是你所需要的一切,但应该给你一个正确的方向。

注意:您还可以使用自己的(递归)迭代或使用(例如,自定义IMarkupFormatter )将规范化作为序列化。有多种方法。给定的操作可以改变DOM --因此,进一步的操作(不仅仅是序列化)是可能的。

希望这能帮上忙!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56182951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档