Html 网页是网页的特定部分

Html 网页是网页的特定部分,html,excel,vba,web-scraping,Html,Excel,Vba,Web Scraping,我的网兜坏了。所有者更改了html 我相信这是需要更改的Set allegements=doc.getElementsByClassName(“el-col el-col-8”)行 我试图从包含“52周范围(未定义)”部分的网页中获取文本。我设法从之前和之后抓取文本,但不是我需要的部分。一个例子是,我的网页和我的代码应该填补我的细胞与“38.72-73.63”后,我做了一些修剪 我需要这样做,这样我就可以在将来有必要的时候改变它,所以请专注于修改我的代码集(假设这就是问题所在!),而不是一个全新

我的网兜坏了。所有者更改了html

我相信这是需要更改的
Set allegements=doc.getElementsByClassName(“el-col el-col-8”)

我试图从包含“52周范围(未定义)”部分的网页中获取文本。我设法从之前和之后抓取文本,但不是我需要的部分。一个例子是,我的网页和我的代码应该填补我的细胞与“38.72-73.63”后,我做了一些修剪

我需要这样做,这样我就可以在将来有必要的时候改变它,所以请专注于修改我的代码集(假设这就是问题所在!),而不是一个全新的更复杂的方法,因为我无法理解它。(我的另一组代码执行我希望它执行的操作。)

Sub get_title_header()
作为对象的Dim wb
Dim doc作为对象
Dim IncomestUrls作为变体
作为字符串的Dim sURL
最后一排一样长
将allRowOfData设置为对象
作为整数的Dim i
Dim等位基因作为IHTMlementCollection
作为IHTMLElement的Dim anElement
将aCell设置为HTMLTableCell
Application.DisplayAlerts=False
调用切换事件(False)
incomeStmtURLs=范围(“表1!h1:h2”)。值
对于i=1至UBound(IncomestMurls)
Set wb=CreateObject(“internetExplorer.Application”)
sURL=收入(i,1)
wb.sURL
wb.Visible=False
当wb忙的时候
申请。现在等待+#12:00:01 AM#
多芬特
温德
Set doc=wb.document
错误时转到错误清除
Set-allElements=doc.getElementsByClassName(“el-col-el-col-8”)
而等位基因。长度=0
申请。现在等待+#12:00:01 AM#
多芬特
温德
x=等位基因(0)。内部文本
'Debug.Print x
表6.单元格(i+1,2).值=修剪(替换(中间(x,仪表(1,x,“52周范围(未定义)”)+25,25),vbLf“”)
Set allegements=doc.getElementsByClassName(“fs-x-large fc primary fw Bold”)
x=等位基因(0)。内部文本
活页6.单元格(i+1,4).值=修剪(替换(中间(x,仪表(1,x,“$”)+1,7),vbLf,“”)
错误清除:
如果错误为0,则
呃,明白了
下一步继续
如果结束
wb.退出
接下来我
调用切换事件(True)
端接头
子切换事件(blnState为布尔值)
Application.DisplayAlerts=blnState
Application.EnableEvents=blnState
如果为blnState,则Application.CutCopyMode=False
如果为blnState,则Application.StatusBar=False
端接头

向下滚动时,页面会动态更新内容。您可能需要将页面的该部分滚动到视图中,然后使用带有classname Statics项的抓取所有元素,然后使用n-2索引,例如,不带滚动部分:

Set elems = ie.document.getElementsByClassName("statictics-item")
If elems.length > 1 Then Debug.print elems(elems.length-2).innerText
对于未来的读者(我知道OP不想要这个):

我将避免整个滚动pickle、动态html和浏览器,并发出xmlhttp请求,并从网页用于更新的javscript对象中输出适当的值。注意,我可能会在正则表达式匹配位置上添加验证

Public Sub test()
    Dim r As String
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.gurufocus.com/stock/gliba/summary", False
        .send
        r = GetMatches(.responseText, "price52wlow:(.*?),|price52whigh:(.*?),")
        If r <> "NA" Then MsgBox r
    End With
End Sub

Public Function GetMatches(ByVal inputString As String, ByVal sPattern As String) As String
    Dim matches As Object

    With CreateObject("vbscript.regexp")
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        .Pattern = sPattern

        'If .test(inputString) Then
        Set matches = .Execute(inputString)

        If matches.Count = 2 Then
            GetMatches = matches.Item(0).submatches(0) & "-" & matches.Item(1).submatches(1)
        Else
            GetMatches = "NA"
        End If
    End With
End Function
公共子测试()
调暗r为字符串
使用CreateObject(“MSXML2.XMLHTTP”)
.打开“获取”https://www.gurufocus.com/stock/gliba/summary”“错
.发送
r=GetMatches(.responseText,“价格52WLOW:(.*),|价格52WHIGH:(.*)”)
如果r“NA”,则MsgBox r
以
端接头
公共函数GetMatches(ByVal inputString作为字符串,ByVal sPattern作为字符串)作为字符串
暗匹配作为对象
使用CreateObject(“vbscript.regexp”)
.Global=True
.MultiLine=True
.IgnoreCase=True
.图案=飞溅
'If.test(inputString)然后
设置匹配项=.Execute(inputString)
如果匹配。计数=2,则
GetMatches=matches.Item(0).子匹配(0)&“-”和matches.Item(1).子匹配(1)
其他的
GetMatches=“NA”
如果结束
以
端函数
正则表达式:


Allegements=doc.getElementsByClassName(“el-col el-col-8”)的输出结果是什么?谢谢你,QHarr,这不是你第一次帮助我了。第二个解决方案当然超出了我的能力范围,事实上,我正在努力训练如何向下滚动窗口(迄今为止,我花了大约45分钟试图找到一个解决方案!)。不过,这真的很有帮助,我不知道这是因为它是一个动态网页。如果您感兴趣,我可以通过上述解决方案与您交谈。当你知道怎么做的时候,这真的很容易,知道怎么做很有帮助。我看到的所有网页都说下面的内容应该可以工作,但它不是wb.document.parentWindow.scroll 0&,200&不要认为它与Excel有关。谢谢你,QHarr,看起来我必须使用和修改你的代码,如果我盯着它看足够长的时间,我希望能解决这个问题,我将不得不把它应用到我的其他宏中,我用这些宏来处理财务数据,很明显,我的方法是不够的,我只是希望避免重写所有内容