Получите данные из списков на веб-сайте, чтобы преуспеть в VBA
1 facebook-100000733797497 [2013-10-11 03:46:00]
Я пытаюсь найти способ получить данные с yelp.com
У меня есть таблица, на которой есть несколько ключевых слов и местоположений. Я хочу извлечь данные из списков визгов на основе этих ключевых слов и местоположений уже в моей таблице.
Я создал следующий код, но он, кажется, получает абсурдные данные, а не точную информацию, которую я ищу.
Я хочу получить фирменное имя, адрес и номер телефона, но все, что я получаю, - ничто. Если кто-нибудь может помочь мне решить эту проблему.
Sub find()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
With ie
ie.Visible = False
ie.Navigate "http://www.yelp.com/search?find_desc=boutique&find_loc=New+York%2C+NY&ns=1&ls=3387133dfc25cc99#start=10"
' Don't show window
ie.Visible = False
'Wait until IE is done loading page
Do While ie.Busy
Application.StatusBar = "Downloading information, lease wait..."
DoEvents
Loop
' Make a string from IE content
Set mDoc = ie.Document
peopleData = mDoc.body.innerText
ActiveSheet.Cells(1, 1).Value = peopleData
End With
peopleData = "" 'Nothing
Set mDoc = Nothing
End Sub
vba excel-vba excel
1 ответ
5 David Zemens [2013-10-11 04:29:00]
Если вы щелкнете правой кнопкой мыши в IE и сделаете View Source, очевидно, что данные, представленные на сайте, не являются частью свойства документа .Body.innerText. Я замечаю, что это часто случается с динамически обслуживаемыми данными, и этот подход действительно слишком прост для большинства веб-скрепок.
Я открываю его в Google Chrome и проверяю элементы, чтобы получить представление о том, что я действительно ищу, и как его найти с помощью парсера DOM/HTML; вам нужно будет добавить ссылку на библиотеку объектов Microsoft HTML.

Я думаю, вы можете вернуть его, чтобы вернуть коллекцию тегов <DIV>, а затем проверить их для имени класса со статусом If внутри цикла.
Я внес некоторые изменения в свой первоначальный ответ, это должно печатать каждую запись в новой ячейке:
Option Explicit
Private Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub find()
'Uses late binding, or add reference to Microsoft HTML Object Library
' and change variable Types to use intellisense
Dim ie As Object 'InternetExplorer.Application
Dim html As Object 'HTMLDocument
Dim Listings As Object 'IHTMLElementCollection
Dim l As Object 'IHTMLElement
Dim r As Long
Set ie = CreateObject("InternetExplorer.Application")
With ie
.Visible = False
.Navigate "http://www.yelp.com/search?find_desc=boutique&find_loc=New+York%2C+NY&ns=1&ls=3387133dfc25cc99#start=10"
' Don't show window
'Wait until IE is done loading page
Do While .readyState <> 4
Application.StatusBar = "Downloading information, Please wait..."
DoEvents
Sleep 200
Loop
Set html = .Document
End With
Set Listings = html.getElementsByTagName("LI") ' ## returns the list
For Each l In Listings
'## make sure this list item looks like the listings Div Class:
' then, build the string to put in your cell
If InStr(1, l.innerHTML, "media-block clearfix media-block-large main-attributes") > 0 Then
Range("A1").Offset(r, 0).Value = l.innerText
r = r + 1
End If
Next
Set html = Nothing
Set ie = Nothing
End Sub