2014-12-22 2 views
1

Я начинаю с того, чтобы узнать о выскабливании. Я получил эту страницу за регистрацией, и я помню, что читал, что вы не должны пытаться делать (1), (2) или (3) вещь после получения элемента по тэгам. Но вы должны скорее получить нечто более уникальное, например, имя класса или идентификатор. Но может кто-то пожалуйста, скажите мне, почемуVBA Excel Scraping

этого 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> 
+2

Всякий раз, когда вы используете что-то, что потенциально может получить больше, чем один элемент, вам необходимо предоставить порядковый индекс. Вы делаете это в первом примере с ** (1) **, который ссылается на второй элемент '' (ординалы основаны на нуле). Во втором примере вы опускаете порядковый номер, поэтому '.getElementsByClassName' не знает, что вернуть, даже если есть только одно, которое соответствует. – Jeeped

+0

Ты босс! Благодаря! –

+0

@Jeeped Это звучит скорее как ответ, чем комментарий, как насчет его выделения, публикация его как одного и получение репутации, которую вы, кажется, заслуживаете? – Aiken

ответ

2

получить ЭЛЕМЕНТ byProperty против получить ЭЛЕМЕНТОВ byProperty

Есть в основном два различных типа команд для извлечения одного или нескольких элементов из веб-страницы .Document; те, которые возвращают один объект, и те, которые возвращают коллекцию объектов.

Получение ЭЛЕМЕНТ

Когда getElementById используется, вы просите для одного объекта (например, MSHTML.IHTMLElement). В этом случае свойства (например, .Value, .innerText, .outerHtml и т. Д.) Могут быть получены непосредственно. Внутри тела HTML не должно быть больше одного уникального свойства id, поэтому эта функция должна безопасно возвращать единственный элемент в пределах i.e.document, который соответствует.

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

Оговорка: Я заметил, что все большее число веб-дизайнеров, которые, кажется, думают, что, используя тот же id для нескольких элементов ой ключ-DOH-ключ до тех пор, как идентификаторы находятся в различных родительских элементов, таких как различные <div> элементов. AFAIK, это явно неправильно, но, похоже, это растущая практика. Будьте осторожны с тем, что возвращается при использовании .getElementById.

Получение ЭЛЕМЕНТОВ

При использовании getElementsByTagName, getElementsByClassName и т.д., где слово элементы множественное число, вы возвращаете коллекцию (например 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 использует элементы (множественное число), а не Element (в единственном числе), вы возвращаете коллекцию, которая должна иметь индекс добавляется, если вы хотите, чтобы лечить один из элементы в коллекции как один элемент.

+0

И ... это было просто впечатляюще. Спасибо чувак! И я согласен, похоже, что одна и та же идентификационная информация распространяется как дикий огонь. После этого у меня на самом деле было 4 разных номера с одинаковым идентификатором и именем класса, но под разными родителями. Получил все, что выясняет. Но еще раз спасибо. Единственный S имеет большое значение. –