Anglesharp 归一化/修复 html
Anglesharp normalize / fix html
我有这张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
放入段落
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 - 这样进一步的操作(不仅仅是序列化)是可能的。
希望对您有所帮助!
我有这张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
放入段落
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 - 这样进一步的操作(不仅仅是序列化)是可能的。
希望对您有所帮助!