Я пытаюсь проверить, является ли тег 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
Селектор CSS:
Вы можете использовать комбинацию селекторов CSS для ориентации интересующего элемента.
Данные находятся в div
, то есть внутри элемента с классом td51
.
Вы можете написать комбинацию селекторов CSS для таргетинга на этот шаблон:
.td51 div
Это говорит о элементах с тегом div
, родителем которого является класс td51
. Где "."
является селектором классов.
Элемент элемента пространства элементов известен как комбинатор потомков.
Результаты запроса CSS:
Этот шаблон соответствует нескольким элементам, и вы хотите, чтобы этот элемент был индексом 6.
При извлечении нескольких элементов вы используете querySelectorAll
для применения комбинатора CSS и получения индекса nodeList
вы индексируете, чтобы получить интересующий объект.
Поскольку вам нужна только часть полученной информации, вы можете использовать split
для "вырезания" требуемой информации. Обратите внимание, что Kit
не Kit
в одиночку, но Kit (CD117)
.
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> Инструменты> Ссылки):
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
Рекомендации:
Это стало довольно долго, но после нашей отладки слияния с вашим другим кодом:
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