Vba XHTML网站抓取指南

Vba XHTML网站抓取指南,vba,excel,parsing,web-scraping,xmlhttprequest,Vba,Excel,Parsing,Web Scraping,Xmlhttprequest,我对VBA和HTML/XHTML非常陌生,但是通过在线研究和其他优秀成员的帮助,我已经成功地编写了一个代码来提取我想要的数据。我很难识别我想要的元素的ID,因为它在XHTML中,所以我认为这是我做得最糟糕的地方 网站: 以下是我希望代码执行的操作: 提取银行名称、地址、电话号码、存款总额和总资产——给定我在excel表中提供的银行名称和城市 这是我的代码: Private声明子睡眠库“kernel32.dll”(ByVal-dwms长度) 次级社区银行() Dim IE作为对象,TableRes

我对VBA和HTML/XHTML非常陌生,但是通过在线研究和其他优秀成员的帮助,我已经成功地编写了一个代码来提取我想要的数据。我很难识别我想要的元素的ID,因为它在XHTML中,所以我认为这是我做得最糟糕的地方

网站:

以下是我希望代码执行的操作: 提取银行名称、地址、电话号码、存款总额和总资产——给定我在excel表中提供的银行名称和城市

这是我的代码:

Private声明子睡眠库“kernel32.dll”(ByVal-dwms长度)
次级社区银行()
Dim IE作为对象,TableResults作为对象,webRow作为对象,BankName作为变量,page作为长,pageTotal作为长,r作为长
Dim beginTime作为日期,i作为长度,myvalue作为变量
设置IE=CreateObject(“internetexplorer.application”)
即“导航”http://www.usbanklocations.com/banks.php?name=&Range(“A2”).值和“+Bank&ml=30&lc=“&Range(“B2”).值和“%2C+TX”
可见=真实
在IE忙或IE.readystate 4'4=readystate\u完成时执行
多芬特
环
'在表格中输入银行名称
'myvalue=InputBox(“输入城市。按OK开始搜索”,“银行搜索”)
'范围(“F3”)。值=myvalue
'IE.document.getelementbyid(“MainContent\u txtCity”).Value=“LegacyTexas”
'单击“查找”按钮
'IE.document.getelementbyid(“MainContent\u btn”)。单击
'睡眠5*1000
IE.document.getelementbytagname(“表”).getelementsbyclassname(“btn”)。单击
睡眠5*1000
“总页数
pageTotal=IE.document.getelementbyid(“lsortby”).innertext
第页=0
执行直到第页=第页总计
多芬特
page=IE.document.getelementbyclassname(“lsortby”).innertext
使用IE.document.getelementbyid(“main”)
对于r=1到.Rows.Length-1
如果不是IsArray(银行名称),则
ReDim BankName(7,0)作为变体
其他的
ReDim保留BankName(7,UBound(BankName,2)+1)作为变体
如果结束
BankName(0,UBound(BankName,2))=.行(r).单元格(0).内部文本
下一个r
以
如果第页<第页总计,则
IE.document.getelementbyclassname(“panelpn”)。单击
开始时间=现在
Application.Wait(现在+时间值(“00:00:05”))
如果结束
环
对于r=0到UBound(银行名称,2)
即“导航”http://www.usbanklocations.com/银行名称(0,r)(&B)
在IE忙或IE.readystate 4'4=readystate\u完成时执行
多芬特
环
“等5秒钟。用于屏幕刷新
睡眠5*1000
使用IE.document.getelementbytagname(“表”)
对于i=0到.Rows.Length-1
多芬特
选择Case.Rows(i).Cells(0).innertext
案例“名称:”
银行名称(1,r)=.行(i).单元格(1).内部文本
案例“地点:”
银行名称(2,r)=.行(i).单元格(1).内部文本
手机:
银行名称(3,r)=.行(i).单元格(1).内部文本
案例“分行存款”:
BankName(4,r)=替换(替换(.Rows(i).Cells(1).innertext,,,,,,,,,,,,,,,,,)
案例“总资产:
BankName(5,r)=替换(替换(.Rows(i).Cells(1).innertext,“,”),“$”,”)
结束选择
接下来我
以
下一个r
即退出
设置IE=无
'在Excel单元格上发布结果
工作表(1)。范围(“A9”)。调整大小(UBound(BankName,2)+1,UBound(BankName,1)+1)。值=应用程序。转置(BankName)
端接头

提前谢谢你!我将非常感谢任何帮助

考虑以下示例,该示例使用XHR代替IE和基于拆分的HTML内容解析:

选项显式
子测试_usbanklocations()
Dim oSource、oDestination、y、oSrcRow、sName、sCity、sDist、sUrl0、sUrl1、sUrl2、lPage、sResp1、sResp2、i、a1、a2、a3、a4、a5
设置oSource=图纸(1)
设置方向=图纸(2)
oDestination.Cells.Delete
数据输出方向,1,数组(“名称”、“位置”、“电话”、“总资产”、“总存款”)
y=2
对于oSource.UsedRange.Rows中的每个oSrcRow
sName=oSrcRow.Cells(1,1).Value
sCity=oSrcRow.Cells(1,2).Value
sDist=oSrcRow.Cells(1,3).Value
sUrl0=”http://www.usbanklocations.com/banks.php?q=“&EncodeUriComponent(sName)&&lc=“&EncodeUriComponent(sCity)&”&ml=“&sDist
sUrl1=sUrl0
lPage=1
做
sResp1=GetXHR(sUrl1)
如果InStr(sResp1,“我们找不到您提供的地址。请检查。”)>0,然后退出Do

a1=Split(SREP1),“用户不能
聚合、复制或复制USBANKLOCATIONS.COM上的内容”
——所以我很确定你无论如何都不应该删除他们的网站",他们指的是他们网站的具体操作。不是用户可以使用的内容。你可以复制/粘贴信息。好的-我通常不会参与删除问题,只是为了谨慎。我只是在你不知道的情况下指出,但如果你高兴这很好,那么就足够公平了。谢谢@MacroMan!我同意请指出这一点。
.getelementbyvalue
.getelementbyclass
.getelementbytag
不是有效的方法。
.getElementsByClassName
.getElementsByTagName
返回按类和标记名选择的节点集合。没有本机函数可按其值检索节点。您是这个XHR/API方法是一个很好的基础。非常感谢。我刚刚熟悉XHR,这将是我第一个用这种格式看的代码。我注意到它对于大数据集来说快得多。非常感谢。@ K.K.BTW使XHRs异步,你可以达到更高的速度,但是代码。那就应该处理事件了。@omegastripes,谢谢你的代码。这对我来说是一项全新的技能。我从中学到了这一点。非常感谢@omegastripes和pcw我