2015-12-25 7 views
2

Я пытаюсь вытащить информацию о продавце с страницы Amazon по цене, автоматизируя веб-браузер. Я пытаюсь запустить приведенный ниже код, но ошибка, которую я получаю, равна:Excel VBA - Извлечение данных с веб-страницы

Объектная переменная или с переменной блока не установлена.

Может ли кто-нибудь направить меня туда, где я ошибаюсь.

Option Explicit 
Sub RunNewModule() 
    Dim ie As InternetExplorer 
    Dim html As HTMLDocument 
    Set ie = CreateObject("InternetExplorer.Application") 
    ie.Visible = False 
    ie.Navigate "http://rads.stackoverflow.com/amzn/click/B00SVA81Z2" 
    Dim priceData As Variant 
    Dim sellerdata As Variant 
    Dim item As Variant 
    Dim cntr As Integer 
    priceData = html.getElementsByClassName("olpOfferPrice").getElementsByTagName("span")(0).innerText 
    cntr = 1 
    For Each item In priceData 
     Range("B" & cntr) = item.innerText 
     cntr = cntr + 1 
    Next item 
    sellerdata = html.getElementsByClassName("olpSellerName").getElementsByTagName("span")(0).innerText  
    cntr = 1 
    For Each item In sellerdata 
     Range("A" & cntr) = item.innerText 
     cntr = cntr + 1 
    Next item 
End Sub 
+1

Вы не назначал 'html'. Теперь он пуст. –

+0

Назначить HTML? где я это делаю –

+0

Вам нужно что-то вроде 'Set html = ie.document' –

ответ

3

Вы не назначили html и теперь это пусто.

Вы должны назначить его таким образом:

Set html= ie.Document 

Чтобы получить элемент по его имени класса:

Dim ie As InternetExplorer 
Dim html As IHTMLDocument 
Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = False 
ie.Navigate "http://stackoverflow.com/questions/34463544/vba-fetching-data-from-class-name" 
While ie.Busy 
    DoEvents 
Wend 
While ie.ReadyState < 4 
    DoEvents 
Wend 
Set html = ie.Document 
Dim elements As IHTMLElementCollection 
Set elements = html.getElementsByClassName("question-hyperlink") 
If elements.Length > 0 Then 
    MsgBox elements(0).innerText 
End If 
ie.Quit 
Set ie = Nothing 

enter image description here

Не забудьте добавить ссылку на:

  • Microsoft Internet Controls
  • Microsoft Html Object library

По этой ссылке амазонки:

Dim ie As InternetExplorer 
Dim html As HTMLDocument 
Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = False 
ie.Navigate "http://www.amazon.in/gp/offer-listing/B00EYCBGNA/ref=dp_olp_new_mbc?ie=UTF8&condition=new" 
While ie.Busy 
    DoEvents 
Wend 
While ie.ReadyState < 4 
    DoEvents 
Wend 

Set html = ie.Document 
Dim elements As IHTMLElementCollection 
Set elements = html.getElementsByClassName("olpOfferPrice") 
For i = 0 To elements.Length - 1 
    Sheet1.Range("A" & (i + 1)) = elements(i).innerText 
Next i 

Set elements = html.getElementsByClassName("olpSellerName") 
For i = 0 To elements.Length - 1 
    Sheet1.Range("B" & (i + 1)) = elements(i).innerText 
Next i 
ie.Quit 
Set ie = Nothing 

enter image description here

+0

Он работает для стека над потоком, но когда я пытаюсь использовать amazon, чтобы получить имена продавцов и цены по этой ссылке, он ничего не показывает с именем класса http://www.amazon.in/gp/offer-listing/B00EYCBGNA/ref= dp_olp_new_mbc? ie = UTF8 & condition = new –

+0

Сообщение отвечает на ваш главный вопрос, но вы должны использовать подходящие значения и логику, чтобы иметь возможность извлекать цены. Ответ действительно лучше. Например, вы можете извлечь цены таким образом: 'Set elements = html.getElementsByClassName (" olpOfferPrice ")' и возвращает массив с длиной 6. –

+0

Я также добавил ваш конкретный случай для этой ссылки amazon. См. Отредактированный ответ, а также обратите внимание на команды 2 'While'. –