【发布时间】:2016-06-15 08:58:23
【问题描述】:
目前我已经使用下面的代码提取了 13,000 个 URL。然而,其中 3,000 人提出了来自 Facebook、Bloomberg 等网站的 URL。对于这些 URL,我一直在手动搜索名称,也许 20 个中有 1 个有宏错过的公司 URL。所以我的问题是:有没有一种方法可以编辑宏,以便如果 URL 页面包含字符串值(例如“facebook”或“wiki”),它将跳过该 URL 并继续搜索确实的 URL不包含字符串值?
我如何提取 URL 的代码:
Sub XMLHTTP()
Dim url As String, lastRow As Long
Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object
Dim start_time As Date
Dim end_time As Date
lastRow = Range("A" & Rows.Count).End(xlUp).Row
Dim cookie As String
Dim result_cookie As String
start_time = Time
Debug.Print "start_time:" & start_time
For i = 2 To lastRow
url = "https://www.google.co.in/search?q=" & Cells(i, 1) & "&rnd=" & WorksheetFunction.RandBetween(1, 10000)
Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
XMLHTTP.Open "GET", url, False
XMLHTTP.setRequestHeader "Content-Type", "text/xml"
XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
XMLHTTP.send
Set html = CreateObject("htmlfile")
html.body.innerHTML = XMLHTTP.ResponseText
Set objResultDiv = html.getelementbyid("rso")
Set objH3 = objResultDiv.getelementsbytagname("H3")(0)
Set link = objH3.getelementsbytagname("a")(0)
str_text = Replace(link.innerHTML, "<EM>", "")
str_text = Replace(str_text, "</EM>", "")
Cells(i, 2) = str_text
Cells(i, 3) = link.href
DoEvents
Next
end_time = Time
Debug.Print "end_time:" & end_time
Debug.Print "done" & "Time taken : " & DateDiff("n", start_time, end_time)
MsgBox "done" & "Time taken : " & DateDiff("n", start_time, end_time)
End Sub
这是我用来根据字符串值过滤掉 URL 的代码:
Sub badURLs()
Dim lr As Long ' Declare the variable
lr = Cells(Rows.Count, 3).End(xlUp).Row ' Set the variable
' lr now contains the last used row in column A
Application.ScreenUpdating = False
For a = lr To 1 Step -1
If InStr(1, Cells(a, 3), "bloomberg", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "manta", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "yellowpages", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "yelp", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "snapshot", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "facebook", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "wiki", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "linkedin", vbTextCompare) > 0 _
Or InStr(1, Cells(a, 3), "hoovers", vbTextCompare) > 0 Then
'Compares for bloomberg, wiki, or hoovers. Enters loop if value is greater than 0
With Cells(a, 3)
.NumberFormat = "General"
.Value = "NA"
End With
End If
Next a
Application.ScreenUpdating = True
End Sub
重申一下:我想知道是否可以(以及如何)根据第二个宏中的字符串值过滤掉第一个宏中的 URL。我希望这将使我获得更准确的 URL 命中,并且我不必手动搜索 3000 个公司名称,希望只有少数公司有有用的 URL。
【问题讨论】:
-
考虑完全限定您的单元格引用,以便始终清楚它们来自哪个表;如果出于任何原因选择了不同的工作表,那么您的代码将出现在错误的位置。并尝试在第一个宏中设置
Cells(i, 3) = CStr(link.href),以防 Excel 对超链接做一些愚蠢的事情 -
那你的第二个宏做什么?这不会过滤它们吗?或者您是否已启动宏但需要帮助完成?您能否对 Alpha 中的 URL 进行排序。命令?这会将所有
Facebook放在一起,将所有bloomberg放在一起等等,以便更快地删除/过滤。 -
@Dave 如果我将 link.href 更改为字符串值,是否可以使用 InStr 过滤 URL 搜索以告诉宏选择不包含第二个宏中的字符串值的 URL?
-
@BruceWayne 问题是在我拥有的 13,000 个 URL 中,其中 3000 个来自第 3 方站点,并不是我想要的 URL。我试图通过告诉它搜索不包含第二个宏中的字符串值的链接/URL 来使第一个宏在其 URL 检索中更准确