Excel VBA извлекает значение href - PullRequest
       21

Excel VBA извлекает значение href

0 голосов
/ 23 сентября 2018

У меня есть макрос, который пытается извлечь все значения href со страницы, но кажется, что он получает только первое.Если кто-то может мне помочь, это будет очень признательно.

Я использовал URL-адрес https://www.facebook.com/marketplace/vancouver/entertainment

Снимок экрана HTML

<div class="_3-98" data-testid="marketplace_home_feed">
  <div>
    <div>
      <div class="_65db">
          <a class="_1oem" href="/marketplace/item/920841554781924" data-testid="marketplace_feed_item">
          <a class="_1oem" href="/marketplace/item/580124349088759" data-testid="marketplace_feed_item">
          <a class="_1oem" href="/marketplace/item/1060730340772072" data-testid="marketplace_feed_item">
    Sub Macro1()
``marker = 0
Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For x = 0 To (IE_count - 1)
    On Error Resume Next    ' sometimes more web pages are counted than are open
    my_url = objShell.Windows(x).document.Location
    my_title = objShell.Windows(x).document.Title

    If my_title Like "Facebook" & "*" Then 'compare to find if the desired web page is already open
        Set ie = objShell.Windows(x)
        marker = 1
        Exit For
    Else
    End If
Next

Set my_data = ie.document.getElementsByClassName("_3-98")
Dim link
i = 1
For Each elem In my_data
    Set link = elem.getElementsByTagName("a")(0)
    i = i + 1

     'copy the data to the excel sheet
    ActiveSheet.Cells(i, 4).Value = link.href

Next

End Sub

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете использовать комбинацию селекторов CSS, чтобы получить элементы.Если вы предоставите фактический HTML-код, а не изображение, вам будет проще протестировать и определить наилучшую комбинацию.Селектор применяется с помощью метода querySelectorAll для возврата nodeList всех соответствующих элементов.Вы пересекаете .Length из nodeList, чтобы получить доступ к элементам по индексу от 0 до .Length-1.

VBA:

Dim aNodeList As Object, i As Long
Set aNodeList = ie.document.querySelectorAll("._1oem[href]")
For i = 0 To aNodeList.Length-1
   Activesheet.Cells(i + 2,4) = aNodeList.item(i)
Next 

Комбинация селектора CSS - ._1oem[href], который выбирает href атрибуты элементов с классом _1oem."." - это селектор класса, а [] - селектор атрибута.Это быстрый и надежный метод.

Выше предполагается, что нет родительских тегов form/frame/iframe для согласования.

Альтернативный селектор, который соответствует двум атрибутам,а не класс будет:

html.querySelectorAll("[data-testid='marketplace_feed_item'][href]")

Полный пример:

Option Explicit
Public Sub GetInfo()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "https://www.facebook.com/marketplace/vancouver/entertainment"

        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim aNodeList As Object, i As Long
        Set aNodeList = IE.document.querySelectorAll("._1oem[href]")
        For i = 0 To aNodeList.Length - 1
            ActiveSheet.Cells(i + 2, 4) = aNodeList.item(i)
        Next
        'Quit '<== Remember to quit application
    End With
End Sub
0 голосов
/ 23 сентября 2018

Вы запрашиваете только первый элемент привязки внутри каждого элемента с классом _3-98.Итерация по коллекции якорных элементов в родительском элементе.

...

dim j as long
Set my_data = ie.document.getElementsByClassName("_65db")

For Each elem In my_data

    for i = 0 to elem.getelementsbytagname("a").count -1

        j = j+1
        ActiveSheet.Cells(j, 4).Value = elem.getElementsByTagName("a")(i).href

    next i

Next elem 

...
...