我想知道是否可以使用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();
返回以下文字
一些示例sourceThis是一个段落元素
理想情况下,我希望它能够回归 一些示例来源这是一个段落元素 其中每个节点文本值之间存在一些分隔。
答案 0 :(得分:1)
我知道我迟到了,但迟到总比没有好(我也希望别人能从这个答案中受益)。
对这个问题的评论都是正确的。一方面我们有W3C规范和文档的来源,它告诉我们在(官方)序列化中没有任何空间,另一方面我们有一个相当常见的情况。 #34;整合&#34;适用时的某些空格(或者甚至是换行符,例如,如果看到<br>
元素)。
正在编写的库不知道您的特定用例(即您想要插入空格时)。但是,它可以帮助您更轻松地 到您想要的状态。
从DOM到字符串的序列化是通过实现IMarkupFormatter
的类的实例完成的。任何DOM节点的ToHtml()
方法都接受这样的对象来返回字符串。做一个
var myFormatter = new MyMarkupFormatter();
var text = document.Body.ToHtml(myFormatter);
现在问题被简化为适用于我们的MyMarkupFormatter的实现。这种格式化器基本上只产生文本节点,但是,某些标签被区别对待(即,返回某些文本,如空格)。
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(String text)
{
return text;
}
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
- 也许这已经非常接近您想要的了(#34;更漂亮&#34;标记格式化程序)。
希望这有帮助!