1

我正在使用 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 和样式。

4

1 回答 1

1

我只是根据此页面的 html 将其放在 LinqPad 中,并正确删除了scriptandstyle标签。

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,请使用后者。如果要删除所有脚本标签,请使用第一个。或者,如果您愿意,可以同时使用两者。

于 2012-05-01T20:48:50.517 回答