无法以正确的方式在querySelectorAll容器中使用querySelector

问题描述

我正在尝试弄清楚如何在.querySelector()上使用.querySelectorAll()

例如,当我这样尝试时,我会得到预期的结果:

Sub GetContent()
    Const URL$ = "https://stackoverflow.com/questions/tagged/web-scraping?tab=Newest"
    Dim HTMLDoc As New HTMLDocument
    Dim HTML As New HTMLDocument,R&,I&
    
    With New XMLHTTP60
        .Open "Get",URL,False
        .send
        HTMLDoc.body.innerHTML = .responseText
    End With

    With HTMLDoc.querySelectorAll(".summary")
        For I = 0 To .Length - 1
            HTML.body.innerHTML = .Item(I).outerHTML
            R = R + 1: Cells(R,1).Value = HTML.querySelector(".question-hyperlink").innerText
        Next I
    End With
End Sub

当我选择另一个站点获取表中Rank列下的值时,即使我使用相同的逻辑,该脚本也不再起作用:

Sub GetContent()
    Const URL$ = "https://www.worldathletics.org/records/toplists/sprints/100-metres/outdoor/men/senior/2020?page=1"
    Dim HTMLDoc As New HTMLDocument
    Dim HTML As New HTMLDocument,I&

    With New XMLHTTP60
        .Open "Get",False
        .send
        HTMLDoc.body.innerHTML = .responseText
    End With

    With HTMLDoc.querySelectorAll("#toplists tbody tr")
        For I = 0 To .Length - 1
            HTML.body.innerHTML = .Item(I).outerHTML
            R = R + 1: Cells(R,1).Value = HTML.querySelector("td").innerText
        Next I
    End With
End Sub

这是我正在谈论的两个脚本中的行Cells(R,1).Value = HTML.querySelector().innerText。我在容器.querySelectorAll()中使用了相同的容器。

如果我在.querySelector()上使用.getElementsByTagName(),则发现它可以正常工作。我还发现在TagName上使用TagName或在ClassName上使用ClassName等都是成功的。因此,我可以通过几种不同的方式来获取内容

如何在第二个脚本的.querySelector()上使用.querySelectorAll()才能使其正常工作?

解决方法

将其包装在表格标签中,以便html解析器知道如何处理它。

HTML.body.innerHTML = "<table>" & .Item(I).outerHTML & "</table>"

这样做可以保留开头的td标签的结构,否则该标签将被剥离掉“