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