webbrowser获取动态网页元素

写第一个博客前先啰嗦介绍下我本人:我其实是个硬件工程师,只是喜欢编程,觉得程序可以大大释放劳动力,所以偶尔会写些小程序,解决日常工作中的小问题,而我写的小程序,都是自动化方向的多(例如本次要实现的自动填表),而且对编程中遇到的问题,会不懈地寻找答案,也因为不是专业程序员,所以一些在大家看来很简单的问题,对我来说就变得不简单。

 通过webbrowser获取静态网页元素比较容易,而要获取动态网页元素就不太容易了,在网上搜索了很久,看了很多文章,最后终于找到答案。

这篇文章:《[参考资料]如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站》  让我学会了用浏览器中的开发人员工具(IE9的F12和Chrome的Ctrl+Shift+I)-网页分析的利器,从而坚定地知道,动态网页元素是一定可以获取的,只是还未找到方法而已。

其实这篇文章:《C# WebBrowser 获取被点击的对像》  里面也提到了解决办法,只是我漏掉了而已。

直到看了这篇文章:《如何获取 WebBrowser.Document 中某命名空间中的元素?》  才真正解决了我要解决的问题,因为里面的网页例子与我要分析的网页一模一样。

技术的关键点是这行代码:webBrowser1.Document.Window.Frames("frm_xxx").Document.Forms(0).InnerHtml

而不是像这个帖子:《请教高手,关于WebBrowser控制Jsp网页元素和获取元素的数据,在线等..》  里5楼说的:WebBrowser1.Document.frames.Item(frameindex).Document.documentElement.outerHTML 

 

根据关键代码,我写了个递归调用函数,用来查找动态网页元素,该函数的缺点是,遇到同一层次的,没有Id、InnerText、Name、title、classname、value,或这些属性值一样的网页元素时,只能返回第一个匹配的网页元素。解决的办法是找到同一层的网页元素后再通过.Parent  、NextSibling、Children来访问。

Function FindHtmlElement(ByVal FindText As String, ByVal doc As HtmlDocument, ByVal cTagName As String, ByVal cGetAttribute As String, Optional ByVal StrictMatching As Boolean = False) As HtmlElement 
        'cTagName:检索具有指定html 标记的元素,标记需要输入完整的,缺省时查找所有。 
        '例如:<input class="button" type="submit" value=提交style="cursor:hand">,不能只输入"i",需要输入"input" 
        'cGetAttribute :比较的属性类型,取值为:Id、InnerText、Name、title、classname、value、 
        'Id、InnerText可以通过GetAttribute获取,也可以通过HtmlElement.Id、HtmlElement.InnerText获取,所以代码简化为用GetAttribute获取。 
        'doc:WebBrowserExt1.Document 
        'GetAttribute("classname")   '例如显示class="commonTable"的值commonTable 
        'StrictMatching:True严格匹配FindText 

        Dim i, k As Integer 

        FindHtmlElement = Nothing 

        'Step1 
        For i = 0 To doc.All.Count - 1 
            If InStr(doc.All.Item(i).GetAttribute(cGetAttribute), FindText) > 0 _ 
                And (Not StrictMatching Or InStr(FindText, doc.All.Item(i).GetAttribute(cGetAttribute)) > 0) And (cTagName = "" Or LCase(cTagName) = LCase(doc.All.Item(i).TagName)) Then 

                FindHtmlElement = doc.All.Item(i) 
                'WriteRunLog("Loop1") 
                Exit Function                       '找到就退出 
            End If 
        Next 

        For k = 0 To doc.Window.Frames.Count - 1 
            '2018.3.14 直接递归调用 
            FindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching) 
            If Not FindHtmlElement Is Nothing Then  '找到就退出循环 
                Exit Function 
            End If 
        Next 

    End Function 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值