【发布时间】:2018-07-05 11:43:33
【问题描述】:
我试图获取的数据示例(查看源代码):https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=8B7B2B88CE03567735560917596FA6BD
源码如下:
<table width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="#e9edf2">
<tr>
<td width="2%" height="20"><font size="1"> </font></td>
<td width="30%" valign="top"><font face="verdana" size="-1">Name:</font></td>
<td width="48%">
<font face="verdana" size="-1"><b>ABBOTT, HUGH ALLAN <small>(Primary Name)</small></b></font></td>
</tr>
我不知道如何故意导航到源的这一部分。我需要以某种方式告诉它在所有带有 TD 的标签中搜索“名称:”,如果存在,请给我标签的下一个内部文本
<b>
在这种情况下是雅培,休艾伦。我需要这种类型的方法,因为使用 item(#) 查找特定文本并不可靠,因为项目的位置发生了变化。我尝试了几种不同的方法,但到目前为止都没有成功。比如“for each td in ....”类型的方法。我最终可以找到正确的项目,但它在多条记录中不可靠。
TIA
编辑 - 这是我拥有的接近的代码:
这假设您有一个具有此路径/名称的文本文件(尽管它表示路径中的电子邮件抓取,而不是在这种情况下尝试获取电子邮件):“C:\Emailgrab\myfloridalicense.com\Extract URL\AgentURLsRaw_Clean. txt”,其中包含以下链接:
https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=2BEA648A94BA20C0C989E9E0071103AF https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=AB8F78E2835A25C2D443B09DE9CDD16F https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=A6DBB6CDEE69A637B4497807A1FE45A6 https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=8B7B2B88CE03567735560917596FA6BD https://www.myfloridalicense.com/LicenseDetail.asp?SID=&id=27A84B8EF8F96AD4F09AF94774456A39
还假设您在此路径/名称处拥有此头文件:“C:\Emailgrab\myfloridalicense.com\Extract URL\Complete.csv”,其中包含以下标头:
姓氏、名字/中间名、地址、许可证编号、许可证状态(a)、许可证状态(b)、许可证到期、URL
VBS 代码:
Dim URLFile
Dim fName
set ie = createobject("internetexplorer.application")
IE.Visible = True
Set objShell = CreateObject("WScript.Shell")
Set WshShell = WScript.CreateObject("WScript.Shell")
set fso = createobject("scripting.filesystemobject")
Set URLFile = fso.OpenTextFile("C:\Emailgrab\myfloridalicense.com\Extract URL\AgentURLsRaw_Clean.txt")
do while not URLFile.AtEndOfStream
fName = URLFile.ReadLine()
ie.navigate fName
do until ie.readystate = 4 : wscript.sleep 10: loop
For Each elm In IE.Document.getElementsByTagName("table")
If elm.getElementsByTagName("TABLE").Length = 16 THEN
name = elm.document.getElementsByTagName("b").item(3).innertext
address = elm.document.getElementsByTagName("b").item(5).innertext
licensenumber = elm.document.getElementsByTagName("b").item(12).innertext
licensestatus = elm.document.getElementsByTagName("b").item(13).innertext
licenseexp = elm.document.getElementsByTagName("b").item(15).innertext
myData = name & ", " & replace(address, vbCrLf, "") & ", " & licensenumber & ", " & licensestatus & ", " & licenseexp & "," & fName & ", " & vbCrlf
set fso = createobject("scripting.filesystemobject")
set ts = fso.opentextfile("C:\Emailgrab\myfloridalicense.com\Extract URL\Complete.csv",8,true)
ts.write myData
ts.close
end if
next
loop
Wscript.Echo "All Data Copied!"
我的方法很接近,但我不太明白为什么它适用于某些链接而不适用于其他链接。您可以在 CSV 中看到,在某些情况下,从许可证号开始数据已关闭,这会导致其余列关闭。此外,在某些情况下,数据中有逗号,所以我添加了一个额外的 LicenseStatus 列来尝试解决这个问题。我只需要一种(最好是简单的)比使用 Item(#) 计数更可靠的方法。希望这可以帮助。谢谢!
【问题讨论】:
-
可能复制到[VBS脚本循环浏览网页和复制数据](stackoverflow.com/q/28384650/3439404),相同的OP。正如您知道如何获取页面源代码,那么您可以知道最原始的方法:
split将页面转换为一个从零开始的一维数组,其中包含子串,例如</tr>分隔符。循环数组,找到一个包含Name:的字符串,用<b>分隔符... -
不完全确定我是否在关注,但我会研究拆分。如果我能把这块弄下来,那么我想我几乎可以拥有我需要的东西来做我需要的一切。谢谢
-
我发现了这个:webmasterworld.com/forum47/1363.htm,但我不明白如何应用它。也没有看到任何关于跳过那个找到下一个内部文本的信息,我不知道如何问谷歌这个问题。我想使用“名称:”来知道我在正确的区域,所以我会知道下一个 是我需要的文本。我还有其他人也可以应用它,所以理解这一点会有所帮助。听起来你在说这是可能的。即使是一个粗略的例子也会有所帮助。
标签: regex web-scraping vbscript xmlhttprequest wsh