VBA извлекает только выбранную информацию между тегами <div>

1

Я пытаюсь проверить, является ли тег html:

<nobr>Target</nobr>

существует на странице, и если это так, найдите текст между тегом html:

<div style='width: 555px; -ms-overflow-x: auto; -ms-overflow-y: hidden;> ... </div>

Текст между тегами div выглядит беспорядочно:

ABC [HSA: 
<a href="...">...</a>
] [KO:
<a href="...">...</a>
]
<br />
GHI-JK [JKI:
...    

И я хочу получать и печатать в своей таблице, но есть много элементов, но мне нужно только имя элемента (в приведенном выше примере есть 2 элемента - ABC и GHI-JK).

Конечно, мой код ниже не работает. Я не думаю, что правильно использую queryselector, и я также не уверен, как только захватить имена элементов, а не целиком между тегами

If IE.document.querySelector("nobr").innerHTML = "Target" Then
    If IE.document.querySelector("div[style^='width: 555px; -ms-overflow-x: auto; -ms-overflow-y: hidden;']") <> 0 Then
         Cells(1, 15).Value = IE.document.querySelector("div[style^='width: 555px; -ms-overflow-x: auto; -ms-overflow-y: hidden;']").innerText
    End If
End If
  • 0
    Пожалуйста, покажите больше HTML и URL, если это возможно, и объясните, какие именно данные вы ожидаете увидеть полученными. Используйте фактический HTML как есть, а не любые сокращения, и используйте инструмент фрагмента, чтобы добавить HTML как код, а не как изображение
  • 0
    @QHarr Добавил ссылку и весь интересующий меня HTML-код
Теги:
excel
web-scraping

1 ответ

1
Лучший ответ

Селектор CSS:

Вы можете использовать комбинацию селекторов CSS для ориентации интересующего элемента.

Данные находятся в div, то есть внутри элемента с классом td51.

Изображение 174551

Вы можете написать комбинацию селекторов CSS для таргетинга на этот шаблон:

.td51 div

Это говорит о элементах с тегом div, родителем которого является класс td51. Где "." является селектором классов.

Элемент элемента пространства элементов известен как комбинатор потомков.


Результаты запроса CSS:

Этот шаблон соответствует нескольким элементам, и вы хотите, чтобы этот элемент был индексом 6.

Изображение 174551

При извлечении нескольких элементов вы используете querySelectorAll для применения комбинатора CSS и получения индекса nodeList вы индексируете, чтобы получить интересующий объект.

Поскольку вам нужна только часть полученной информации, вы можете использовать split для "вырезания" требуемой информации. Обратите внимание, что Kit не Kit в одиночку, но Kit (CD117).


XMLHTTPRequest XHR:

Option Explicit
Public Sub GetInfo()
    Dim sResponse As String, i As Long, html As New HTMLDocument, arr() As String, ele As Object

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.kegg.jp/dbget-bin/www_bget?dr:D01441", False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    With html
        .body.innerHTML = sResponse
        On Error Resume Next
        Set ele = .querySelectorAll(".td51 div")(6)
        On Error GoTo 0
        If ele Is Nothing Then Exit Sub
        arr = Split(ele.innerText, Chr$(10))
    End With
    For i = LBound(arr) To UBound(arr)
        Debug.Print Split(arr(i), "[")(0)
    Next i
End Sub

Ссылки (VBE> Инструменты> Ссылки):

  1. Библиотека объектов Microsoft HTML

Internet Explorer:

Option Explicit
Public Sub GetInfo()
    Dim ie As New InternetExplorer, html As HTMLDocument, arr() As String, ele As Object, i As Long

    With ie
        .Visible = True
        .navigate "https://www.kegg.jp/dbget-bin/www_bget?dr:D01441"

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

        Set html = .document
        On Error Resume Next
        Set ele = html.querySelectorAll(".td51 div")(6)
        On Error GoTo 0

        If ele Is Nothing Then Exit Sub  
        arr = Split(ele.innerText, Chr$(10))

        For i = LBound(arr) To UBound(arr)
            Debug.Print Split(arr(i), "[")(0)
        Next i
        '.Quit '<== Remember to quit application
    End With
End Sub

Рекомендации:

  1. Microsoft Internet Controls
  2. Библиотека объектов Microsoft HTML

РЕДАКТИРОВАТЬ:

Это стало довольно долго, но после нашей отладки слияния с вашим другим кодом:

Option Explicit
Public Sub ht()
    Dim ie As Object, ele As Object, i As Long
    Dim sourceSheet As Worksheet, lastRow As Long, rawString() As String, rowIndex As Long
    Dim arrayOfValues() As Variant, html As HTMLDocument, arr() As String
    Const URL As String = "https://www.genome.jp/kegg/drug/"
    Set sourceSheet = Worksheets("Sheet1")
    lastRow = sourceSheet.Range("A30000").End(xlUp).Row
    arrayOfValues = sourceSheet.Range("A1:A" & lastRow)

    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True

        For rowIndex = 1 To lastRow
            .navigate URL
            Do While .readyState <> 4 Or .Busy: DoEvents: Loop

            rawString = VBA.Strings.Split(VBA.Strings.LCase$(arrayOfValues(rowIndex, 1)), ": ", -1, vbBinaryCompare)

            'MsgBox rawString(1)
            .document.querySelector("input[name=q]").Value = rawString(1)
            .document.querySelector("input[value=Go]").Click

            Do While .readyState <> 4 Or .Busy: DoEvents: Loop

            Dim ele2 As Object
            On Error Resume Next
            Set ele2 = .document.querySelector("a[href^='/dbget-bin/www_bget?dr:']")
            On Error GoTo 0
            If ele2 Is Nothing Then GoTo NextLink
            ele2.Click

            Do While .readyState <> 4 Or .Busy: DoEvents: Loop

            Set html = .document
            On Error Resume Next
            Set ele = html.querySelectorAll(".td51 div")(6)
            On Error GoTo 0

            If Not ele Is Nothing Then
                arr = Split(ele.innerText, Chr$(10))
                For i = LBound(arr) To UBound(arr)
                    Debug.Print Split(arr(i), "[")(0)
                Next i
            End If
NextLink:
        Next rowIndex
        .Quit
    End With
End Sub
  • 0
    И нет никакого способа искать тег <nobr>, который имеет «Target» внутри, с помощью queryselection или иным образом?
  • 0
    Не могли бы вы объяснить, как добраться до CSS-запроса, как вы делали в своем посте?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню