Проблемы с печатью определенного содержимого в цикле, полученном из другого цикла - PullRequest
0 голосов
/ 01 марта 2019

Я создал скрипт vba для анализа времени различных сообщений, определенных как postTime и их заголовков на веб-странице.Хотя postTime доступно на целевой странице, я хотел бы получить его с целевой страницы и распечатать с postTitle, полученным с целевой страницы.Я определил селекторы в моем скрипте, которые могут собирать желаемое содержимое.Тем не менее, моя текущая попытка печатает только postTime определенного сообщения, тогда как я хочу напечатать postTime нескольких сообщений.

Как я могу напечатать элемент вцикл, производный от другого цикла?

Мой сценарий до сих пор:

Sub CollectData()
    Const baseUrl = "https://stackoverflow.com"
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim post As Object, itemlist$, linklist As Variant
    Dim qualifiedLink$, nlink As Variant, postTime$, postTitle$

    With Http
        .Open "GET", "https://stackoverflow.com/questions/tagged/web-scraping", False
        .send
        Html.body.innerHTML = .responseText
    End With

    Set post = Html.querySelectorAll(".summary .question-hyperlink")

    For I = 0 To post.Length - 1
        postTime = Html.querySelector(".user-action-time").innerText
        qualifiedLink = baseUrl & Split(post(I).getAttribute("href"), "about:")(1)
        itemlist = itemlist & IIf(itemlist = "", "", " ") & qualifiedLink
    Next I

    linklist = Split(itemlist, " ")

    For Each nlink In linklist
        With Http
            .Open "GET", nlink, False
            .send
            Html.body.innerHTML = .responseText
        End With
        postTitle = Html.querySelector("h1[itemprop='name'] a").innerText
        ' the following line prints postTime derived from earlier loop
        Debug.Print postTime, postTitle
    Next nlink
End Sub

1 Ответ

0 голосов
/ 01 марта 2019

Вам нужно использовать querySelectorAll и индексировать его во время первого цикла, чтобы гарантировать, что вы получите различное время постов.Я хотел бы хранить их в коллекции и обращаться к ним по индексу в последнем цикле

Option Explicit

Public Sub CollectData()
    Const baseUrl = "https://stackoverflow.com"
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim post As Object, itemlist$, linklist As Variant, i As Long
    Dim qualifiedLink$, nlink As Variant, postTime$, postTitle$
    Dim times As Object
    Set times = New Collection
    With Http
        .Open "GET", "https://stackoverflow.com/questions/tagged/web-scraping", False
        .send
        Html.body.innerHTML = .responseText
    End With

    Set post = Html.querySelectorAll(".summary .question-hyperlink")

    For i = 0 To post.Length - 1
        postTime = Html.querySelectorAll(".user-action-time").item(i).innerText
        times.Add postTime
        qualifiedLink = baseUrl & Split(post(i).getAttribute("href"), "about:")(1)
        itemlist = itemlist & IIf(itemlist = "", "", " ") & qualifiedLink
    Next i

    linklist = Split(itemlist, " ")
    Dim accessor As Long
    For Each nlink In linklist
        accessor = accessor + 1
        With Http
            .Open "GET", nlink, False
            .send
            Html.body.innerHTML = .responseText
        End With
        postTitle = Html.querySelector("h1[itemprop='name'] a").innerText
        ' the following line prints postTime derived from earlier loop
        Debug.Print times(accessor), postTitle

    Next nlink
End Sub

Еще лучше, хранить время в переменной, а не продолжать использовать querySelectorAll в цикле, так как это будетбыть более эффективным:

Option Explicit

Public Sub CollectData()
    Const baseUrl = "https://stackoverflow.com"
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim post As Object, itemlist$, linklist As Variant, i As Long
    Dim qualifiedLink$, nlink As Variant, postTime$, postTitle$
    Dim times As Object
    Set times = New Collection
    With Http
        .Open "GET", "https://stackoverflow.com/questions/tagged/web-scraping", False
        .send
        Html.body.innerHTML = .responseText
    End With

    Set post = Html.querySelectorAll(".summary .question-hyperlink")
    Dim timesList As Object
    Set timesList = Html.querySelectorAll(".user-action-time")
    For i = 0 To post.Length - 1
        postTime = timesList.item(i).innerText
        times.Add postTime
        qualifiedLink = baseUrl & Split(post(i).getAttribute("href"), "about:")(1)
        itemlist = itemlist & IIf(itemlist = "", "", " ") & qualifiedLink
    Next i

    linklist = Split(itemlist, " ")
    Dim accessor As Long
    For Each nlink In linklist
        accessor = accessor + 1
        With Http
            .Open "GET", nlink, False
            .send
            Html.body.innerHTML = .responseText
        End With
        postTitle = Html.querySelector("h1[itemprop='name'] a").innerText
        ' the following line prints postTime derived from earlier loop
        Debug.Print times(accessor), postTitle

    Next nlink
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...