Как получить значение из класса span сайта? - PullRequest
0 голосов
/ 22 января 2020

У меня есть русский сайт - https://zakupki.gov.ru/epz/contract/contractCard/common-info.html?reestrNumber=2183104497918000748

Мне нужно значение после заголовка "Дата заключения контракта", которое равно 30.10.2018.

Как извлечь значение и поместить его в ячейку Excel?

Я нашел CSS селектор этого значения .container:nth-child(6) .section:nth-child(1) .section__info".

У меня есть следующий код:

Sub pupa()
Dim wb As Workbook
Dim ws As Worksheet
Dim TxtRng As Range
Dim ie As Object
Dim data As String, ipt As String, tblsheet As Worksheet, gtrpt As String, lastrow As Integer, i As Integer
Set tblsheet = ThisWorkbook.Sheets("Таблица")
lastrow = tblsheet.UsedRange.Rows.Count

For n = 2 To lastrow
    i = n
    ipt = tblsheet.Cells(n, 1)
    Set ie = CreateObject("INTERNETEXPLORER.APPLICATION")
    With ie
        .Visible = True
        .Navigate "https://zakupki.gov.ru/epz/contract/contractCard/common-info.html?reestrNumber=" & ipt '
        Do Until .ReadyState = 4: DoEvents: Loop
        tblsheet.Cells(i, 2) = ie.document.getElementById("section__info").innerText
        .Quit
    End With    
Next

End Sub

1 Ответ

0 голосов
/ 22 января 2020

Вы можете получить заголовок, используя getElementsByClassName ("container") (7) , а затем getElementsByClassName ("section__title") (0) . С помощью метода getElementsByClassName () вы создаете коллекцию узлов, которая включает каждый элемент HTML с требуемым классом CSS. Если вы знаете, какой элемент коллекции узлов является тем, который вам нужен, вы можете получить его по его индексу.

Первый индекс коллекции узлов равен 0. В документе HTML вашей страницы 15 элементы класса с CSS class «контейнером» . В восьмом стоит нужное вам значение, так что это элемент с индексом 7. После этого вы можете использовать захваченный элемент в качестве основы для следующего использования getElementsByClassName () . В элементе захваченного контейнера есть только 1 элемент с CSS классом "section__title" , поэтому мы используем индекс 0.

Хитрость заключается в том, чтобы обвести нужное значение, пока вы не сможете легко поднять его. В этом случае во всем документе имеется 37 элементов с CSS классом "section__title" , поэтому я бы go через "контейнер" . (Код отредактирован для получения даты)

'Needed Variables
Dim nodeContainer As Object
'Dim nodeTitle As Object
Dim nodeDate As Object
'...
'Your code
'...
'Grab the needed value with help of the above variables
Set nodeContainer = ie.document.getElementsByClassName("container")(7)
'Set nodeTitle = nodeContainer.getElementsByClassName("section__title")(0)
Set nodeDate = nodeContainer.getElementsByClassName("section__info")(0)
'tblsheet.Cells(n, 1) = Trim(nodeTitle.innertext)
tblsheet.Cells(n, 1) = Trim(nodeDate.innertext)
'...
'More of your code

Чтобы проверить, сколько элементов с указанным классом c CSS находятся в документе, вы можете использовать свойство length коллекция узлов.

'Number of HTML elements with the CSS class "container"
Set nodeContainer = ie.document.getElementsByClassName("container")
MsgBox nodeContainer.Length

'Number of HTML elements with the CSS class "section__title"
Set nodeTitle = ie.document.getElementsByClassName("section__title")
MsgBox nodeTitle.Length

Редактировать: Вы можете сделать то же самое без переменных следующим образом. Но я бы не стал этого делать, потому что вы не можете перехватывать ошибки между объектами, если это необходимо:

tblsheet.Cells(i, 2) = ie.document.getElementsByClassName("container")(7).getElementsByClassName("section__info")(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...