如何在mshtml.HTMLDocument(.NET)中禁用Javascript
时间:2020-03-06 14:45:18 来源:igfitidea点击:
我有这样的代码:
Dim Document As New mshtml.HTMLDocument Dim iDoc As mshtml.IHTMLDocument2 = CType(Document, mshtml.IHTMLDocument2) iDoc.write(html) iDoc.close()
但是,当我加载这样的HTML时,它会执行其中的所有Javascript并从" html"代码中请求某些资源。
我想禁用javascript和所有其他弹出窗口(例如证书错误)。
我的目标是使用mshtml文档中的DOM以可靠的方式(而不是一堆正则表达式)从HTML中提取一些标签。
还是有另一个IE / Office DLL,我可以在考虑IE相关的弹出窗口或者活动脚本的情况下加载HTML了?
解决方案
如果我们已经将'html'作为字符串,并且只想访问它的DOM视图,那么为什么要将它"渲染"到浏览器控件中呢?
我对.Net技术不熟悉,但是必须有某种StringToDOM / StringToJSON类型的东西可以更好地满足需求。
同样,如果上面使用的'html'变量是URL,则只需使用wget或者类似方法将标记检索为字符串,然后使用适用的工具进行解析。
我会寻找一个.Net XML / DOM库并使用它。 (再次,我认为这将是语言的一部分,但我不确定)
PS快速谷歌后,我发现了这一点(源)。不知道这是否有帮助,如果我们要在HTMLDocument中使用它。
if(typeof(DOMParser) == 'undefined') { DOMParser = function() {} DOMParser.prototype.parseFromString = function(str, contentType) { if(typeof(ActiveXObject) != 'undefined') { var xmldata = new ActiveXObject('MSXML.DomDocument'); xmldata.async = false; xmldata.loadXML(str); return xmldata; } else if(typeof(XMLHttpRequest) != 'undefined') { var xmldata = new XMLHttpRequest; if(!contentType) { contentType = 'application/xml'; } xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false); if(xmldata.overrideMimeType) { xmldata.overrideMimeType(contentType); } xmldata.send(null); return xmldata.responseXML; } } }
听起来我们好像是在抓取一些资源,然后尝试以编程方式执行某些操作(使用结果HTML)?
如果我们提前知道它是有效的XHTML,则将XHTML字符串(实际上是XML)加载到XmlDocument对象中,然后以这种方式使用它。
否则,如果它可能是无效的或者格式不正确的HTML,那么我们将需要像hpricot之类的东西(但这是一个Ruby库)
Dim Document As New mshtml.HTMLDocument Dim iDoc As mshtml.IHTMLDocument2 = CType(Document, mshtml.IHTMLDocument2) 'add this code iDoc.designMode="On" iDoc.write(html)iDoc.close()
如果我没记错的话,MSHTML会自动继承IE的设置。
因此,如果我们在Internet Explorer中为正在执行代码的用户禁用javascript,则Javascript也不应在MSHTML中运行。