У меня возникла проблема соскабливания некоторого HTML
.
Вот URL, где мой macro
ломается, а ниже - выдержка из кода:
Set els = IE.Document.getelementsbytagname("a")
For Each el In els
If Trim(el.innertext) = "Documents" Then
colDocLinks.Add el.href
End If
Next el
Как вы можете видеть, открываете ли вы URL
мы запускаем в результатах поиска; то макрос находит все links
в таблице поиска и помещает их в Collection
именем colDocLinks
Однако результаты поиска содержат на их 10-Q
документы, которые я хочу включить, но у них также есть разные виды животных, которые я не хочу включать в себя как 10-Q/A
документы...
Как я могу изменить цикл так, чтобы он явно добавлял только 10-Q, ничего не связанного с ними в коллекции, а не других, таких как 10-Q/A?
Public WithEvents objIE As InternetExplorer
Sub LaunchIE()
Set objIE = New InternetExplorer
objIE.Visible = True
objIE.Navigate "http://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=icld&type=10-Q%20&dateb=&owner=exclude&count=20"
End Sub
Private Sub objIE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim localIE As InternetExplorer
Set localIE = pDisp
Dim doc As MSHTML.IHTMLDocument3
Set doc = localIE.Document
Dim tdElements As MSHTML.IHTMLElementCollection
Dim td As MSHTML.IHTMLElement
Set tdElements = doc.getElementsByTagName("td")
For Each td In tdElements
If td.innerText = "10-Q" Then
Dim tr As MSHTML.IHTMLElement
Set tr = td.parentElement
Dim childrenElements As MSHTML.IHTMLElementCollection
Dim child As MSHTML.IHTMLElement
Set childrenElements = tr.Children
For Each child In childrenElements
If child.innerText = " Documents" Then
'Handle found element
End If
Next
End If
Next
End Sub
Я бы использовал регулярное выражение для поиска и извлечения точных ссылок, которые я искал. Что-то вроде этого:
Dim RegEx As RegExp
Set RegEx = New RegExp
Dim match As match
With RegEx
.IgnoreCase = True
.Global = True
.MultiLine = True
End With
RegEx.Pattern = "<td nowrap="nowrap">10-Q</td>.+?<a href=""(.+?)\.htm"">"
For Each match In RegEx.Execute(Selection)
colDocLinks.Add match
Next
Я не тестировал регулярное выражение выше, поэтому может потребоваться некоторая корректировка. Для этого вам нужно будет включить ссылку на Microsoft VBScript Regular Expressions 5.5.
Dim tr As MSHTML.IHTMLElement
должна измениться наDim tr As MSHTML.IHTMLElement2
а строкаSet childrenElements = tr.Children
должна измениться наSet childrenElements = tr.getElementsByTagName("a")