使用VBA

时间:2019-03-29 12:20:27

标签: excel vba web-scraping

我正在尝试从一个网站抓取整个div。数据在源代码中不可见,它会根据URL(link)中的变量进行更改。

我正在寻找将

中的所有内容复制到excel工作表的任何解决方案
<div id="div_measures_for_2103909010" class="measures_detail">

不幸的是,由于直接源代码中没有数据,因此我找到了一种只显示Link上提供的div中数据的方法。

但是,要获取此数据,我首先需要获取指向直接数据的链接(该链接位于源代码中)。

您是否知道如何最好地处理它?<​​/ p>

我试图下载源代码,搜索链接,打开链接并复制所有数据,但是我在下载源代码时遇到了麻烦(由于单元数据的限制,excel仅下载其中的一部分)。这是我当前的代码:

Sub Open_Webpage()

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "https://ec.europa.eu/taxation_customs/dds2/taric/measures.jsp?Lang=en&SimDate=20190329&Area=&MeasType=&StartPub=&EndPub=&MeasText=&GoodsText=&op=&Taric=2103909010&search_text=goods&textSearch=&LangDescr=pl&OrderNum=&Regulation=&measStartDat=&measEndDat="
objHTTP.Open "GET", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send ("")
html = objHTTP.responseText
Range("A1").Value = html

End Sub

如果我可以在一个单元格中拥有完整的代码,则可以在源代码中查找链接并使用它:

=MID(LEFT(A1,FIND("' width='100%'",A1)-1),FIND("' src='",A1)+7,LEN(A1))

我知道必须有一些更好的解决方案,但是我对VBA的了解不是那么熟练...

1 个答案:

答案 0 :(得分:1)

您可以将所需的网址进行正则表达式,进行一些清洁,然后传递给xhr。由于某些原因,我无法简单地使用getAttribute("onclick"),因此不得不在元素上使用outerHTML(也可以使用innerHTML

Option Explicit
Public Sub GetInfo()
    Dim html As HTMLDocument, s As String, re As Object, url As String
    Set re = CreateObject("vbscript.regexp")
    Set html = New HTMLDocument                  '<  VBE > Tools > References > Microsoft Scripting Runtime
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://ec.europa.eu/taxation_customs/dds2/taric/measures.jsp?Lang=en&SimDate=20190329&Area=&MeasType=&StartPub=&EndPub=&MeasText=&GoodsText=&op=&Taric=2103909010&search_text=goods&textSearch=&LangDescr=pl&OrderNum=&Regulation=&measStartDat=&measEndDat=", False
        .send
        html.body.innerHTML = .responseText

        s = html.querySelector("[id$='_end_goods']").outerHTML
        With re
            .Global = True
            .MultiLine = True
            .IgnoreCase = True
            .Pattern = "measures_details\.jsp(.*)'\);"
            If .Test(s) Then
                url = "https://ec.europa.eu/taxation_customs/dds2/taric/measures_details.jsp" & .Execute(s)(0).SubMatches(0)
                url = Replace$(url, "&amp;", "&")
            End If
        End With
        If Len(url) > 0 Then
            .Open "GET", url, False
            .send
            html.body.innerHTML = .responseText                
            ActiveSheet.Cells(1, 1) = html.querySelector(".measures_detail").innerText
        End If
    End With
End Sub

尝试使用正则表达式here


参考:

  1. VBE>工具>参考> Microsoft HTML对象库