Как я могу извлечь список цен с веб-сайта с помощью VBA?

Добрый день -

Я читаю список автомобилей из 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

Сначала я пытаюсь напечатать цены, чтобы проверить, генерирует ли код какой-либо результат.

user3618585 27.11.2022 15:03
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование 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

user3618585 28.11.2022 02:40

Я добавил эту ссылку «Microsoft Internet Controls», и ваш код работает, однако я не понимаю порядок результатов.

user3618585 28.11.2022 02:53

@user3618585 user3618585 код, который я дал, был просто примером того, как получить доступ к элементам, которые вы искали. Я обновил код, он должен заменить ваш саб.

NickSlash 28.11.2022 13:23

Здравствуйте. Синтаксис URL меняется для разных городов. Не могли бы вы проверить эту ссылку и помочь мне извлечь информацию о транспортных средствах и цену, как и в предыдущем коде? wyoming.craigslist.org/search/cta#search=1~list~2~0

user3618585 01.12.2022 03:09

Другие вопросы по теме