Удаление jquery и CSS из XML-документа

Я использую 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 и стиль должен быть удален.

1 ответ

Решение

Я просто бросил это вместе в LinqPad на основе HTML этой страницы, и он правильно удаляет 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, используйте последний. Если вы удаляете все теги скрипта, используйте первый. Или используйте оба, если хотите.

Другие вопросы по тегам