我正在使用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);第三步:一旦我有了一个get文档,我就使用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和样式需要删除。
发布于 2012-05-02 04:48:51
我只是根据这个页面的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,请使用后者。如果要删除所有脚本标记,请使用第一个脚本标记。或者,如果您愿意,可以同时使用这两种方法。
https://stackoverflow.com/questions/10400262
复制相似问题