2016-07-27 60 views
0

我需要在Excel中使用vba查找附加图片中的字符串。我有下面的代码,但它没有找到我期待的日期。 for循环找出是在最后“每个元素在Elements2”在DOM Explorer中使用VBA查找字符串

Dim Doc As HTMLDocument 
Dim Elements As IHTMLElementCollection 
Dim elements1 As IHTMLElementCollection 
Dim Elements2 As IHTMLElementCollection 

Dim iCnt As Integer 
Dim Element As IHTMLElement 
Dim appIE As InternetExplorerMedium 

Sheets(1).Cells(1, 1).Value = "" 
complete = 0 

Set appIE = New InternetExplorerMedium 
sURL = "https://example.com" 

With appIE 
    .Navigate sURL 
    .Visible = True 

    Do While appIE.Busy Or appIE.ReadyState <> 4 
     DoEvents 
    Loop 

    Do While complete <> 1 

     Set Doc = appIE.Document 
     Set Elements = Doc.GetElementsByTagName("input") 
     Set elements1 = Doc.GetElementsByTagName("strong") 
     Set Elements2 = Doc.GetElementsByTagName("td") 


      For Each Element In Elements 
       If Element.ID = "form-id" Then 
        requestnumber = Element.GetAttribute("Value") 
       End If 

       If Element.ID = "remedy-case-info" Then 
        CaseInfo = Element.GetAttribute("Value") 
       End If 
      Next Element 



      For Each Element In elements1 

      If InStr(1, Element.InnerHtml, "EM") Then 

       For iCnt = 1 To Len(Element.InnerText) 
        If IsNumeric(Left(Element.InnerText, 2)) Then 
         NumericOnly (Element.InnerText) 
        End If 
       Next iCnt 
      End If 
      Next Element 
      AClientCount = tempcount 



      For Each Element In Elements2 

      ' If InStr(1, Element.InnerHtml, "td") Then 
        If InStr(1, Element.InnerHtml, "value-field align-top") Then 
          Requestdate = Element.GetAttribute("Value") 
        End If 
      ' End If 

      Next Element 
      Set Elements = Nothing 

     If requestnumber <> "" Then 
      Sheets(1).Cells(1, 1).Value = requestnumber & " - " & CaseInfo & " - " & tempcount & " - " & Requestdate 
      complete = 1 
     End If 
Loop 
.Quit 

End With 

enter image description here

+0

如果您执行'debug.print Element.InnerHtml',那么日期会显示在直接窗口中作为整个InnerHtml的一部分吗?如果是这样,使用'Mid \ Left \ Right等'来解析字符串中的日期。 –

+0

不幸的是,它根本就没有选择那个短语。我可以看到其他与td标签相关的短语,但不是这样。 – user3323922

+0

也许所有的'element2.innerhtml'上的debug.pring都会显示正确的,然后你可以构建一个方法去除它。有时候,这是我在调试网站抓取时发现的唯一方法。 –

回答

0

innerHTML属性拿起一个标签中的内容,但不拿起标签本身。 outerHTML属性包括标签本身以及标签的内容。

例子:

HTML <p class="fee fie foe fum">bar <b>bat</b> <i>cat</i> car</p>

  • 的innerHTML bar <B>bat</B> <I>cat</I> car
  • outerHTML <P class="fee fie foe fum">bar <B>bat</B> <I>cat</I> car</P>

要对元素的属性值进行文本匹配,你需要看看元素的outerHTML属性而不是innerHTML属性。

然而,元素的类属性可以通过className属性来访问,所以你可以用这个替换上的innerHTML的InStr函数:

If InStr(1, Element.className, "value-field align-top") Then 

这是不理想的,因为这将是非常有效写不同顺序的类名 - 例如class="align-top value-field" - 这不会被InStr函数拾取。

这将是更好地与getElementsByClassName方法开始(不关心哪个命令即将类名是在),然后使用该标记名属性来检查我们有正确的标签,就像这样:

Set Elements2 = Doc.getElementsByClassName("value-field align-top") 

' code for the loops on Elements and Elements1 goes here 

For Each Element In Elements2 
    If Element.tagName = "td" Then 

最后,Element.getAttribute("value")将返回Null,除非该元素具有名为“value”的命名属性。要获取元素的文本值,请使用下面的代码:

Requestdate = Element.innerText 
+0

谢谢你的手推车。根据您的指示进行更改并使我的代码正常工作。非常感谢。 – user3323922