我正在使用sgmlreader将HTML转换为XML。输出进入XmlDocument对象,然后我可以使用InnerText方法从网站中提取纯文本。我试图通过删除任何JavaScript来使文本看起来尽可能干净。循环遍历xml并删除任何<script type="text/javascript">
都很容易,但是当任何jquery或样式没有封装在任何标签中时,我都会碰到一堵砖墙。有人可以帮帮我吗?
示例代码:
第一步: 一旦我使用webclient类下载HTML,我保存它,然后用文本阅读器类打开文件。
第二步: 创建sgmlreader类并将输入流设置为文本阅读器:
// setup SGMLReader
Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
sgmlReader.InputStream = reader;
// create document
doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.XmlResolver = null;
doc.Load(sgmlReader);
第三步: 一旦我有了xmldocument,我就使用doc.InnerText来获取我的纯文本。
第四步: 我可以像这样轻松删除JavaScript代码:
XmlNodeList nodes = document.GetElementsByTagName("text/javascript");
for (int i = nodes.Count - 1; i >= 0; i--)
{
nodes[i].ParentNode.RemoveChild(nodes[i]);
}
有些东西仍然滑落。下面是我正在编写的一个特定网站的输出示例:
Criminal and Civil Enforcement | Fraud | Office of Inspector General | U.S. Department of Health and Human Services
#fancybox-right {
right:-20px;
}
#fancybox-left {
left:-20px;
}
#fancybox-right:hover span, #fancybox-right span
#fancybox-right:hover span, #fancybox-right span {
left:auto;
right:0;
}
#fancybox-left:hover span, #fancybox-left span
#fancybox-left:hover span, #fancybox-left span {
right:auto;
left:0;
}
#fancybox-overlay {
/* background: url('/connections/images/wc-overlay.png'); */
/* background: url('/connections/images/banner.png') center center no-repeat; */
}
$(document).ready(function(){
$("a[rel=photo-show]").fancybox({
'titlePosition' : 'over',
'overlayColor' : '#000',
'overlayOpacity' : 0.9
});
$(".title-under").fancybox({
'titlePosition' : 'outside',
'overlayColor' : '#000',
'overlayOpacity' : 0.9
})
});
需要删除jquery和样式。
答案 0 :(得分:1)
我只是根据此页面的html将它放在LinqPad中,并正确删除了script
和style
标记。
void Main()
{
string htmlPath = @"C:\Users\Jschubert\Desktop\html\test.html";
var sgmlReader = new Sgml.SgmlReader();
var stringReader = new StringReader(File.ReadAllText(htmlPath));
sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
sgmlReader.InputStream = stringReader;
// create document
var doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.XmlResolver = null;
doc.Load(sgmlReader);
List<XmlNode> nodes = doc.GetElementsByTagName("script")
.Cast<XmlNode>().ToList();
var byType = doc.SelectNodes("script[@type = 'text/javascript']")
.Cast<XmlNode>().ToList();
var style = doc.GetElementsByTagName("style").Cast<XmlNode>().ToList();
nodes.AddRange(byType);
nodes.AddRange(style);
for (int i = nodes.Count - 1; i >= 0; i--)
{
nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.DumpFormatted();
stringReader.Close();
sgmlReader.Close();
}
投射到XmlNode
以使用通用列表并不理想,但我是为了空间和演示而做的。
另外,你不应该两个都
doc.GetElementsByTagName("script")
和
doc.SelectNodes("script[@type = 'text/javascript']")
。
我再次为了示范而这样做。
如果您有其他脚本并且只想删除JavaScript,请使用后者。如果要删除所有脚本标记,请使用第一个。或者,如果你愿意,可以同时使用它们。