65.9K
CodeProject 正在变化。 阅读更多。
Home

包装您的 HTML 解析器以排除脚本

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.94/5 (8投票s)

2003年12月26日

1分钟阅读

viewsIcon

40968

处理复杂的 HTML 页面需要进行分段或内容排除。

引言

大多数支持脚本的互联网应用程序都需要排除脚本。这个包装器可以正确地从测试中排除脚本元素,并防止脚本被篡改。读取文件后,它会被放入一个数组中,以便逐行处理。如果你试图禁用由 IE 引起的异常,请清除已保存文档的第 2 行,以防止它重新断言原始文档对象模型。它会在新的文档上这样做。清除该行会强制它创建一个新的模型。请注意,这是在准备后续浏览器导航时完成的,而不是本次解析会话。

    Dim loc, z as long    
    Elements = Split(s, vbCrLf)

    Elements(1) = ""     
    in_script = False
    
    For i = 2 To UBound(Elements)
        z = 1
        If in_script = False Then
            loc = InStr(z, UCase(Elements(i)), "<SCRIPT ", vbBinaryCompare)
            If loc > 0 Then
                If (InStr(z, UCase(Elements(i)), 
                    "<SCRIPT ", vbBinaryCompare) > 0 And 
                    InStr(z, UCase(Elements(i)), 
                    "</SCRIPT>", vbBinaryCompare) > 0) Then
                    in_script = False
                    Elements(i) = Replace(Elements(i), 
                      Page & "_files/", myscriptsfolder)
                    z = loc + 8
                Else
                    Elements(i) = Replace(Elements(i), 
                      Page & "_files/", myscriptsfolder)
                    in_script = True
                End If
            End If
                      
'/////////////////////////////////////////////////         

            
'  ADD MORE PARSER METHODS HERE
            

'insert basetag method calls InsertBaseElement method
            
loc = InStr(z, Elements(i), "<HEAD>", vbBinaryCompare)
            
If loc > 0 
  Then
            
    If (objDocument.getElementsByTagName("BASE").length = 0) 
      Then                  
        Elements(i) = InsertBaseElement(Elements(i), loc)               
     Else            
        Elements(i) = Replace(Elements(i), s, ARCRoot)
            
  End If
End If           
            
'/////////////////////////////////////////////////

DoEvents '///////////////////////////////////////////////// 'This code can be modified to suit special 'requirements 'It is useful for chopping of a
'document with dynamic footer content
'written by script methods '(Coders may be trying to ensure some kind of difficulty getting a ' clean archive document from their service.) This code attempts ' to cleanup the non-compliant HTML footer. loc = InStr(z, UCase(Elements(i)), "</SCRIPT>", vbBinaryCompare) If loc > 0 Then in_script = False i = i + 1 Elements(i) = "</BODY></HTML>" i = i + 1 Do While i < UBound(Elements) Elements(i) = "" i = i + 1 Loop End If Else 'in_script = true so look for endtag loc = InStr(z, UCase(Elements(i)), "</SCRIPT>", vbBinaryCompare) If loc > 0 Then in_script = False End If End If Next

Using the Code

插入你自己的方法来替换链接、图像标签、插入表格、页脚等。保持这个包装器完整将保护脚本部分,并防止解析器方法出现故障。我添加了 z 值,让解析器能够处理 HTML 中的字符串,这些字符串在找到 </SCRIPT> 标签后包含代码(就像纽约时报的页面一样)。

我需要为没有提供可用的演示而道歉。目前,在不泄露太多关于 BOWSER 解析方法的情况下,很难直接提供一个有用的演示。这个包装器被用于我的 BOWSER 演示中。

有趣的点

似乎提供商正在使用复杂的结构来防止对其内容进行商业质量的存档。我可以处理平均 HTML 网站的内容,但纽约时报及其动态内容插入会造成混乱,使用技术来导致我的解析器跳过内容或以其他方式出现故障。目前,我正在添加代码来处理在 </SCRIPT> 标签之后找到的 HTML,就像一场猫捉老鼠的游戏。解析器变得越复杂,就越容易被破坏。

© . All rights reserved.