Как вы получаете следующий элемент на веб-странице в VBA - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать макрос VBA для получения большого количества данных с веб-сайта http://stt.wiki.В частности, я начинаю со страницы https://stt.wiki/wiki/Galaxy_Event и хочу перейти к разделу, который начинается с «Галактических событий», и вытянуть каждый элемент из списка под ним.

Итак, у меня есть следующее:

Dim IE As New InternetExplorer
IE.Visible = True
IE.navigate "https://stt.wiki/wiki/Galaxy_Event"
Do
    DoEvents
Loop Until IE.readyState = READYSTATE_COMPLETE
Dim Doc As HTMLDocument
Set Doc = IE.document
Dim sH2 As String

Я знаю, что могу сделать sH2 = Trim (Doc.getElementsByClassName ("mw-headline") (0) .innerText)

дляПосмотрите на элемент, который соответствует «Событиям Галактики», но я не нахожу способ затем получить следующий элемент, так как это не тот элемент, который имеет какой-либо общий атрибут с событиями Галактики.Я не решаюсь нацелить его на LI (Doc.getElementsByTagName ("li") (9)), потому что веб-сайт может изменить и сломать все, что я делаю (хотя я полагаю, что я мог бы перебирать элементы LI, пока не найду один без класса)

В любом случае, как бы мне просто перейти к следующему элементу, когда он отличается во всех отношениях (и я попробовал FirstChild. Это вернуло ошибку).

1 Ответ

0 голосов
/ 22 февраля 2019

Веб-скребок хрупок по своей природе.API - лучший способ получения контента.

В отсутствие API я бы собрал список ссылок в этом разделе и зациклился, если искал конкретный заголовок

Option Explicit
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub GetData()
    Dim ie As New InternetExplorer, i As Long
    With ie
        .Visible = True
        .Navigate2 "https://stt.wiki/wiki/Galaxy_Event"
        While .Busy Or .readyState < 4: DoEvents: Wend

        Dim galaxyEvents As Object
        Set galaxyEvents = .document.querySelectorAll("ol li > a[title]")
        For i = 0 To galaxyEvents.Length - 1
            Debug.Print galaxyEvents.item(i).Title
            'Or any comparison required here then Exit For if found
        Next
        .Quit
    End With
End Sub

Похоже, вы можете попытаться использовать API, который существует, хотя мне пришлось взломать мой синтаксис вики-API.Требуется jsonconverter.bas добавление в проект, затем VBE> Инструменты> Ссылки> Добавить ссылку на Microsoft Scripting Runtime.

Option Explicit
Public Sub GetInfo()
    Dim json As Object, dict As Object, link As String
    Const BASE_URL As String = "https://stt.wiki/wiki/"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://stt.wiki/w/api.php?action=parse&format=json&page=Galaxy_Event&section=1", False
        .send
        Set json = JsonConverter.ParseJson(.responseText)("parse")("links") '<==Will include references links
        For Each dict In json
            link = dict("*")
            Debug.Print link
            Debug.Print BASE_URL & Replace$(link, Chr$(32), Chr$(95))
        Next
    End With
End Sub

Для API, который я нашел это в пределахHTML для URL, который вы дали.Затем я пролистал соответствующую документацию здесь .

...