Извлечь гиперссылку с помощью запроса селектора CSS - PullRequest
0 голосов
/ 19 ноября 2018

Я бы хотел извлечь гиперссылку с веб-страницы, используя queryselector all, но результатов не получилось.

Ниже мой код.

Sub ScrapLink()

Application.ScreenUpdating = False
Dim IE As New InternetExplorer, html As HTMLDocument
Dim x As Long    
Application.ScreenUpdating = False
With IE
IE.Visible = True
IE.Navigate "http://www.bursamalaysia.com/market/listed-companies/company-announcements/5978065" 
While .Busy Or .ReadyState < 4: DoEvents: Wend
Application.Wait Now + TimeSerial(0, 0, 1)
DoEvents

With .Document.getElementById("bm_ann_detail_iframe").contentDocument
     Dim links As Object, i As Long
     Set links = .Document.querySelectorAll("p.att_download_pdf[href^='/FileAccess/apbursaweb/']")
     For i = 1 To links.Length
      With ThisWorkbook.Worksheets("Sheet1")
       Range("A" & Rows.Count).End(xlUp).Offset(1).Value = links.Item(i - 1)
    End With
   Next i
  .Quit
  End With
 End With
End Sub

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы можете просто избежать начальной страницы и использовать URL прямо из фрейма. Это было бы моим предпочтением, если вы по какой-то причине не знаете этот URL.

Option Explicit

Public Sub GetInfo()
    Dim IE As New InternetExplorer, nodeList As Object, i As Long
    With IE
        .Visible = True
        .navigate2 "http://disclosure.bursamalaysia.com/FileAccess/viewHtml?e=2906127"

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

        Set nodeList = .document.querySelectorAll(".att_download_pdf [href^='/FileAccess/apbursaweb/download']")
        For i = 0 To nodeList.Length - 1
            Debug.Print nodeList.item(i).href
        Next
        .Quit
    End With
End Sub

Или вы можете сразу перейти к iframe src после загрузки страницы:

Option Explicit   
Public Sub GetInfo()
    Dim IE As New InternetExplorer, nodeList As Object, i As Long
    With IE
        .Visible = True
        .Navigate2 "http://www.bursamalaysia.com/market/listed-companies/company-announcements/5978065"

        While .Busy Or .readyState < 4: DoEvents: Wend      
        .Navigate2 .document.querySelector("iframe").src           
        While .Busy Or .readyState < 4: DoEvents: Wend

        Set nodeList = .document.querySelectorAll(".att_download_pdf [href^='/FileAccess/apbursaweb/download']")
        For i = 0 To nodeList.Length - 1
            Debug.Print nodeList.item(i).href
        Next
        .Quit
    End With
End Sub
0 голосов
/ 19 ноября 2018

Попробуйте следующее. Он должен получить ссылки, которые вы хотите получить:

Sub ScrapLink()
    Dim IE As New InternetExplorer, Html As HTMLDocument
    Dim frame As Object, i As Long

    With IE
        .Visible = True
        .navigate "http://www.bursamalaysia.com/market/listed-companies/company-announcements/5978065"
        While .Busy Or .readyState < 4: DoEvents: Wend
        Set Html = .document
    End With

    Application.Wait Now + TimeValue("00:00:03") 'This delay may vary in your case

    Set frame = Html.getElementById("bm_ann_detail_iframe").contentWindow.document
    With frame.querySelectorAll("p.att_download_pdf a")
        For i = 0 To .Length - 1
            Cells(i + 1, 1) = .item(i).getAttribute("href")
        Next i
    End With
End Sub

Если вы хотите убрать задержку, попробуйте заменить часть ниже на приведенную выше:

Do: Set frame = Html.getElementById("bm_ann_detail_iframe"): DoEvents: Loop While frame Is Nothing

With frame.contentWindow.document.querySelectorAll("p.att_download_pdf a")
    For i = 0 To .Length - 1
        Cells(i + 1, 1) = .item(i).getAttribute("href")
    Next i
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...