【发布时间】:2016-10-14 07:41:12
【问题描述】:
我对 VBA 和 HTML/XHTML 非常陌生,但是通过在线研究和这里其他优秀成员的帮助,我设法编写了一个代码来提取我想要的数据。我很难确定我想要的元素的 ID,因为它在 XHTML 中,所以我认为这是我最糟糕的地方。
网站:http://www.usbanklocations.com/banks.php?q=&ct=&ml=30&lc=
这是我希望代码执行的操作: 提取银行名称、地址、电话号码、总存款和总资产——给定我在 Excel 表中提供的银行名称和城市。
这是我的代码:
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Sub CommunityBanks()
Dim IE As Object, TableResults As Object, webRow As Object, BankName As Variant, page As Long, pageTotal As Long, r As Long
Dim beginTime As Date, i As Long, myvalue As Variant
Set IE = CreateObject("internetexplorer.application")
IE.navigate "http://www.usbanklocations.com/banks.php?name=" & Range("A2").Value & "+Bank&ml=30&lc=" & Range("B2").Value & "%2C+TX"
IE.Visible = True
Do While IE.Busy Or IE.readystate <> 4 '4 = READYSTATE_COMPLETE
DoEvents
Loop
'input bank name into form
'myvalue = InputBox("Enter City. Press okay to begin search", "Bank Search")
'Range("F3").Value = myvalue
'IE.document.getelementbyid("MainContent_txtCity").Value = "LegacyTexas"
'click find button
'IE.document.getelementbyid("MainContent_btn").Click
'Sleep 5 * 1000
IE.document.getelementbytagname("table").getelementsbyclassname("btn").Click
Sleep 5 * 1000
'total pages
pageTotal = IE.document.getelementbyid("lsortby").innertext
page = 0
Do Until page = pageTotal
DoEvents
page = IE.document.getelementbyclassname("lsortby").innertext
With IE.document.getelementbyid("main")
For r = 1 To .Rows.Length - 1
If Not IsArray(BankName) Then
ReDim BankName(7, 0) As Variant
Else
ReDim Preserve BankName(7, UBound(BankName, 2) + 1) As Variant
End If
BankName(0, UBound(BankName, 2)) = .Rows(r).Cells(0).innertext
Next r
End With
If page < pageTotal Then
IE.document.getelementbyclassname("panelpn").Click
beginTime = Now
Application.Wait (Now + TimeValue("00:00:05"))
End If
Loop
For r = 0 To UBound(BankName, 2)
IE.navigate "http://www.usbanklocations.com/" & BankName(0, r)
Do While IE.Busy Or IE.readystate <> 4 '4 = READYSTATE_COMPLETE
DoEvents
Loop
'wait 5 sec. for screen refresh
Sleep 5 * 1000
With IE.document.getelementbytagname("table")
For i = 0 To .Rows.Length - 1
DoEvents
Select Case .Rows(i).Cells(0).innertext
Case "Name:"
BankName(1, r) = .Rows(i).Cells(1).innertext
Case "Location:"
BankName(2, r) = .Rows(i).Cells(1).innertext
Case "Phone:"
BankName(3, r) = .Rows(i).Cells(1).innertext
Case "Branch Deposit:"
BankName(4, r) = Replace(Replace(.Rows(i).Cells(1).innertext, ",", ""), "$", "")
Case "Total Assets:"
BankName(5, r) = Replace(Replace(.Rows(i).Cells(1).innertext, ",", ""), "$", "")
End Select
Next i
End With
Next r
IE.Quit
Set IE = Nothing
'post result on Excel cell
Worksheets(1).Range("A9").Resize(UBound(BankName, 2) + 1, UBound(BankName, 1) + 1).Value = Application.Transpose(BankName)
End Sub
提前感谢您!我将不胜感激任何帮助。
【问题讨论】:
-
ToS for usbanklocations.com 声明用户不能
aggregate, copy or duplicate content on USBANKLOCATIONS.COM- 所以我很确定你不应该抓取他们的网站...... -
通过“on”,他们指的是专门针对他们网站的操作。不是用户可以使用的内容。您可以复制/粘贴信息。
-
好的——我一般不会为了谨慎起见而参与抓取问题。我只是在你不知道的情况下指出,但如果你很高兴这很好,那就足够公平了。
-
谢谢@MacroMan!感谢您指出这一点。
-
.getelementbyvalue、.getelementbyclass、.getelementbytag不是有效的方法。.getElementsByClassName,.getElementsByTagName返回由类和标签名称选择的节点集合。没有本地函数可以通过节点的值来检索节点。
标签: vba excel parsing web-scraping xmlhttprequest