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
时,请注意返回的内容。
获取元素
当使用getElementsByTagName
, getElementsByClassName
等单词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
方法使用了元素 (复数)而不是元素 (单数),那么如果您希望将集合中的某个元素作为单个元素处理,那么您将返回一个必须附加索引号的集合。