1

HTML を XML に変換するために sgmlreader を使用しています。出力は XmlDocument オブジェクトに送られ、InnerText メソッドを使用して Web サイトからプレーン テキストを抽出できます。JavaScriptを削除して、テキストをできるだけきれいに見せようとしています。xml をループして削除するの<script type="text/javascript">は簡単ですが、jquery やスタイリングがどのタグにもカプセル化されていないと、壁にぶち当たります。誰でも私を助けることができますか?

サンプルコード:

ステップ 1: webclient クラスを使用して HTML をダウンロードしたら、それを保存し、テキスト リーダー クラスでファイルを開きます。

ステップ 2: 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);

ステップ 3: xmldocument を作成したら、doc.InnerText を使用してプレーン テキストを取得します。

ステップ 4: 次のように 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 でこれをまとめたところ、タグscriptstyleタグが適切に削除されました。

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 に答える