VBA Excel刮

我开始尝试学习刮研究。 我得到这个页面是在login后面,我记得你不应该尝试通过标记名来获取元素之后做(1),(2)或(3)的事情。 但是,您应该更喜欢像Classname或ID这样的更独特的东西。 但有人可以告诉我为什么

这个GetTag的作品

Dim Companyname As String Companyname = ie.document.getElementsByTagName("span")(1).innertext 

这个GetClass 不起作用

 Dim Companyname As String Companyname = ie.document.getElementsByClassName("account-website-name").innertext 

这是我正在刮的文字

 <span class="account-website-name" data-journey-name="true">Dwellington Journey</span> 

通过Property获得ELEMENT与通过Property获得ELEMENTS

主要有两种不同types的命令从网页的.Document检索一个或多个元素; 那些返回单个对象和返回对象集合的对象。

获取元素

当使用getElementById ,你需要一个单独的对象(例如MSHTML.IHTMLElement )。 在这种情况下,属性(如.Value.innerText.outerHtml等)可以直接检索。 在HTML体内不应该有多个唯一的id属性,所以这个函数应该安全的返回匹配的iedocument中唯一的元素。

 'typical VBA use of getElementById Dim CompanyName As String CompanyName = ie.document.getElementById("CompanyID").innerText 

警告:我注意到越来越多的网页devise师似乎认为使用相同的id为多个元素,只要id在不同的父元素(如不同的<div>元素)内,就是oh-key-doh-key。 AFAIK,这显然是错误的,但似乎是一个越来越多的做法。 使用.getElementById时,请注意返回的内容。

获取元素

当使用getElementsByTagNamegetElementsByClassName等单词Elements是复数时,即使该集合只包含一个或甚至没有包含对象的集合 (例如MSHTML.IHTMLElementCollection ),也是如此。 如果要使用它们直接访问集合中某个元素的属性,则必须提供一个序号索引号,以便引用该集合中的单个元素。 这些集合中的索引号是基于零的(即第一个从(0)开始)。

 'retrieve the text from the third <span> element on a webpage Dim CompanyName As String CompanyName = ie.document.getElementsByTagName("span")(2).innerText 'output all <span> classnames to the Immediate window until the right one comes along 'retrieve the text from the first <span> element with a classname of 'account-website-name' Dim e as long, es as long es = ie.document.getElementsByTagName("span").Length - 1 For e = 0 To es Debug.Print ie.document.getElementsByTagName("span")(e).className If ie.document.getElementsByTagName("span")(e).className = "account-website-name" Then CompanyName = ie.document.getElementsByTagName("span")(e).innerText Exit For End If Next e 'same thing, different method Dim eSPN as MSHTML.IHTMLElement, ecSPNs as MSHTML.IHTMLElementCollection ecSPNs = ie.document.getElementsByTagName("span") For Each eSPN in ecSPNs Debug.Print eSPN.className If eSPN.className = "account-website-name" Then CompanyName = eSPN.innerText Exit For End If Next eSPN Set eSPN = Nothing: Set ecSPNs = Nothing 

总而言之,如果您的Internet.Explorer方法使用了元素 (复数)而不是元素 (单数),那么如果您希望将集合中的某个元素作为单个元素处理,那么您将返回一个必须附加索引号的集合。