Добрый день -
Я читаю список автомобилей из Craigslist Miami, используя VBA. Код отлично работает с печатью ссылок для каждого автомобиля, однако мне нужно извлечь цену и напечатать ее в соседней ячейке. Я могу получить имя класса, но не могу прочитать результат. Пожалуйста, смотрите код ниже. Он работает нормально, за исключением цены:
Sub GetvehPosts()
Dim link As HTMLLinkElement
Dim blog As HTMLLinkElement
Dim price As HTMLLinkElement
Dim IE As Object
Dim html As HTMLDocument
Dim URL As String
Dim URLParameter As String
Dim page As Long, counter As Long
'Dim http As Object
Dim links As Object
Dim blogpost As Object
Dim priceonly As Object
Dim StartCell As Range
Dim increment As Integer
Dim htmlele1 As HTMLLinkElement
' This is the first cell that a blog post hyperlink is created in
Set StartCell = Range("A15")
URL = "https://miami.craigslist.org/search/cta"
Set IE = CreateObject("InternetExplorer.Application")
Application.ScreenUpdating = True
' CHnage this to False if you want to hide IE
IE.Visible = True
counter = 0
'Set the number of pages of the website to go through in the browser
For page = 0 To 480 Step 120 'increment by 120 - total 4 pages
'Debug.Print page
If page > 1 Then URLParameter = "?s = " & page
IE.navigate URL & URLParameter
'Wait for the browser to load the page
Do Until IE.readyState = 4
DoEvents
Loop
Set html = IE.document
Set links = html.getElementsByTagName("h3")
For Each link In links
If InStr(LCase(link.outerHTML), "result-heading") Then
Set blogpost = link.getElementsByTagName("a")
Set priceonly = link.getElementsByClassName("result-price")
For Each blog In blogpost
StartCell.Offset(counter, 0).Hyperlinks.Add _
Anchor:=StartCell.Offset(counter, 0), Address:=blog, _
TextToDisplay:=link.innerText
Next blog
For Each price In priceonly
If price.className = "result-price" Then
Debug.Print price.innerText
End If
Next price
counter = counter + 1
End If
Next link
Next page
IE.Quit
Set IE = Nothing
End Sub
Использование InternetExplorer обычно доставляет массу неудобств. (Selenium довольно хорошо работает с Excel и имеет функциональность типа querySelector)
Но пока пользуюсь InternetExplorer...
Попробуйте работать с IHTMLElementCollection(s)
вместо IHTMLElement(s)
, потому что в коллекциях все еще есть методы getElement(s)..
.
Мне никогда не удавалось заставить getElementsByClassName
работать должным образом. Разметка данных, которые вы очищаете, скорее всего, будет исправлена, поэтому работа с дочерними индексами достаточно надежна.
Я попытался извлечь текст ссылки и цену для каждого элемента в вашей цели, и, похоже, это работает для меня.
Sub getPosts()
Dim Browser As InternetExplorer
Dim HTML As IHTMLDocument
Dim Results As IHTMLElementCollection
Dim Result As IHTMLElementCollection
Dim URL As String
Dim URLParameter As String
Dim Index As Integer
URL = "https://miami.craigslist.org/search/cta"
URLParameter = ""
Set Browser = New InternetExplorer
Browser.Visible = True
Browser.navigate URL & URLParameter
Do Until Browser.readyState = 4
DoEvents
Loop
Set HTML = Browser.document
Set Results = HTML.getElementsByClassName("result-row")
For Index = 0 To Results.Length - 1
Debug.Print "LinkText:" & Results(Index).getElementsByTagName("h3")(0).getElementsByTagName("a")(0).innerText
Debug.Print "Price:" & Results(Index).getElementsByTagName("span")(0).innerText
Next Index
Browser.Quit
Set Browser = Nothing
End Sub
обновлять
приведенный выше код просматривает только первую страницу и выводит текст ссылки и цену каждого сообщения в окно отладки. (это был пример того, как получить доступ к элементам, которые вы искали)
Я снова добавил код навигации по страницам и вывел его на рабочий лист, а не в окно отладки.
Sub getPosts()
Dim Browser As InternetExplorer
Dim HTML As IHTMLDocument
Dim Results As IHTMLElementCollection
Dim Result As IHTMLElementCollection
Dim URL As String
Dim URLParameter As String
Dim Index As Integer
Dim Counter As Integer: Counter = 0
Dim Page As Integer
Dim Link As IHTMLElement
Dim Price As IHTMLElement
Dim StartCell As Range: Set StartCell = Range("Sheet1!A15") ' adjust sheet name
URL = "https://miami.craigslist.org/search/cta"
URLParameter = ""
Set Browser = New InternetExplorer
Browser.Visible = True
For Page = 0 To 480 Step 120
If Page > 1 Then
URLParameter = "?s = " & Page
End If
Browser.navigate URL & URLParameter
Do Until Browser.readyState = 4
DoEvents
Loop
Set HTML = Browser.document
Set Results = HTML.getElementsByClassName("result-row")
For Index = 0 To Results.Length - 1
Set Link = Results(Index).getElementsByTagName("h3")(0).getElementsByTagName("a")(0)
StartCell.Offset(Counter, 0).Hyperlinks.Add StartCell.Offset(Counter, 0), Link.href, , , Link.innerText
Set Price = Results(Index).getElementsByClassName("result-price")(0)
StartCell.Offset(Counter, 1).Value = Price.innerText
Counter = Counter + 1
Next Index
Next Page
Browser.Quit
Set Browser = Nothing
End Sub
Привет, Ник. Ваш код возвращает ошибку. Dim Browser Как InternetExplorer «определяемый пользователем тип не определен» Однако я использовал строки кодов для цены из вашего кода, он печатает цену, но индексы неверны. Как я могу настроить свой код для печати цены в ячейке рядом с каждой ссылкой? Например, ниже приведен текущий первый автомобиль и цена. Мой код печатает ссылку, но мне нужна цена, как показано ниже: COLUMN A COLUMN B 2019 CHEVROLET TRAVERSE $18 500
Я добавил эту ссылку «Microsoft Internet Controls», и ваш код работает, однако я не понимаю порядок результатов.
@user3618585 user3618585 код, который я дал, был просто примером того, как получить доступ к элементам, которые вы искали. Я обновил код, он должен заменить ваш саб.
Здравствуйте. Синтаксис URL меняется для разных городов. Не могли бы вы проверить эту ссылку и помочь мне извлечь информацию о транспортных средствах и цену, как и в предыдущем коде? wyoming.craigslist.org/search/cta#search=1~list~2~0
Сначала я пытаюсь напечатать цены, чтобы проверить, генерирует ли код какой-либо результат.