AngleSharp 提取格式化文本
AngleSharp extracting formatted text
我想知道是否可以使用 AngleSharp 从 HTMLDocument 中提取格式化文本。我正在使用以下代码来提取文本。我遇到的问题是提取的文本一起运行,每个元素之间没有中断。
var parser = new HtmlParser();
var document = parser.Parse("<script>var x = 1;</script> <h1>Some example source</h1><p>This is a paragraph element</p>");
var text = document.Body.Text();
此 return 是以下文字
一些示例来源这是一个段落元素
理想情况下,我希望 return
一些示例来源这是一个段落元素
每个节点文本值之间有一些分隔。
我知道我迟到了,但迟到总比不到好(我也希望其他人能从这个答案中受益)。
问题的评论都对。一方面我们有 W3C 规范和文档的来源,它告诉我们在(官方)序列化中不会有任何 space,另一方面我们有一个很常见的情况 "integrate" 一些 spaces 在适用时(或者甚至换行符,例如,如果看到 <br>
元素)。
正在编写的库不知道您的具体用例(即,当您想要插入space时)。但是,它可以帮助您更轻松地达到您想要的状态。
从 DOM 到字符串的序列化是通过实现 IMarkupFormatter
的 class 实例完成的。任何 DOM 节点的 ToHtml()
方法接受这样一个对象到 return 一个字符串。做一个
var myFormatter = new MyMarkupFormatter();
var text = document.Body.ToHtml(myFormatter);
现在问题简化为适用于我们的 MyMarkupFormatter 的实现。这个格式化程序基本上只会产生文本节点,然而,某些标签被不同地对待(即 returning some 文本,例如 spaces)。
public class MyMarkupFormatter : IMarkupFormatter
{
String IMarkupFormatter.Comment(IComment comment)
{
return String.Empty;
}
String IMarkupFormatter.Doctype(IDocumentType doctype)
{
return String.Empty;
}
String IMarkupFormatter.Processing(IProcessingInstruction processing)
{
return String.Empty;
}
String IMarkupFormatter.Text(ICharacterData text)
{
return text.Data;
}
String IMarkupFormatter.OpenTag(IElement element, Boolean selfClosing)
{
switch (element.LocalName)
{
case "p":
return "\n\n";
case "br":
return "\n";
case "span":
return " ";
}
return String.Empty;
}
String IMarkupFormatter.CloseTag(IElement element, Boolean selfClosing)
{
return String.Empty;
}
String IMarkupFormatter.Attribute(IAttr attr)
{
return String.Empty;
}
}
如果剥离所有非文本信息不是您所需要的,那么 AngleSharp 还提供开箱即用的 PrettyMarkupFormatter
- 也许这已经非常接近您想要的("prettier" 标记格式化程序)。
希望对您有所帮助!
我想知道是否可以使用 AngleSharp 从 HTMLDocument 中提取格式化文本。我正在使用以下代码来提取文本。我遇到的问题是提取的文本一起运行,每个元素之间没有中断。
var parser = new HtmlParser();
var document = parser.Parse("<script>var x = 1;</script> <h1>Some example source</h1><p>This is a paragraph element</p>");
var text = document.Body.Text();
此 return 是以下文字
一些示例来源这是一个段落元素
理想情况下,我希望 return 一些示例来源这是一个段落元素 每个节点文本值之间有一些分隔。
我知道我迟到了,但迟到总比不到好(我也希望其他人能从这个答案中受益)。
问题的评论都对。一方面我们有 W3C 规范和文档的来源,它告诉我们在(官方)序列化中不会有任何 space,另一方面我们有一个很常见的情况 "integrate" 一些 spaces 在适用时(或者甚至换行符,例如,如果看到 <br>
元素)。
正在编写的库不知道您的具体用例(即,当您想要插入space时)。但是,它可以帮助您更轻松地达到您想要的状态。
从 DOM 到字符串的序列化是通过实现 IMarkupFormatter
的 class 实例完成的。任何 DOM 节点的 ToHtml()
方法接受这样一个对象到 return 一个字符串。做一个
var myFormatter = new MyMarkupFormatter();
var text = document.Body.ToHtml(myFormatter);
现在问题简化为适用于我们的 MyMarkupFormatter 的实现。这个格式化程序基本上只会产生文本节点,然而,某些标签被不同地对待(即 returning some 文本,例如 spaces)。
public class MyMarkupFormatter : IMarkupFormatter
{
String IMarkupFormatter.Comment(IComment comment)
{
return String.Empty;
}
String IMarkupFormatter.Doctype(IDocumentType doctype)
{
return String.Empty;
}
String IMarkupFormatter.Processing(IProcessingInstruction processing)
{
return String.Empty;
}
String IMarkupFormatter.Text(ICharacterData text)
{
return text.Data;
}
String IMarkupFormatter.OpenTag(IElement element, Boolean selfClosing)
{
switch (element.LocalName)
{
case "p":
return "\n\n";
case "br":
return "\n";
case "span":
return " ";
}
return String.Empty;
}
String IMarkupFormatter.CloseTag(IElement element, Boolean selfClosing)
{
return String.Empty;
}
String IMarkupFormatter.Attribute(IAttr attr)
{
return String.Empty;
}
}
如果剥离所有非文本信息不是您所需要的,那么 AngleSharp 还提供开箱即用的 PrettyMarkupFormatter
- 也许这已经非常接近您想要的("prettier" 标记格式化程序)。
希望对您有所帮助!