表格式的网页抓取

时间:2019-06-04 13:10:15

标签: html excel vba web-scraping

我正在尝试从TD和TR格式复制数据。我是数据抓取的新手,所以我没有在Google搜索中找到任何结果。

我要在“常规”的“ A”列中复制所有单位尺寸(例如5 * 5) “ B”中的价格,“ D”中的现金价格,“ F”中的前三个月50%的折扣(优惠)和“ G”列中的储备金。

http://westgateselfstorage.com/index.php?page=estimator

坦率地说,我无法对代码进行框架设计,因此,如果有人帮助我构建代码,这对我真的很有帮助。

2 个答案:

答案 0 :(得分:1)

剪贴板

您关心布局吗?您可以通过剪贴板直接复制并且布局与页面相同

Option Explicit

Public Sub GetTable()
    Dim html As HTMLDocument, clipboard As Object, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    Set html = New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://westgateselfstorage.com/index.php?page=estimator", False
        .send
        html.body.innerHTML = .responseText
    End With
    clipboard.SetText html.querySelector("#hiderow").outerHTML
    clipboard.PutInClipboard
    ws.Range("A1").PasteSpecial
End Sub

QuerySelector和代理:

如果您更在意,那么我们可以使用常用的方法来查找行并进行循环,使用替代HTMLDocument变量来容纳html,这样我们就可以在更细微的层次上利用querySelector不能连锁。唯一的区别是,如果我们将html从tr级别插入HTMLDocument,我们需要在html上添加table标签,以确保querySelectorAll可以拾取{{行中的1}} s,即列。

现在,我还没有在“现金价格”列中将旧价格与降价分开。如果您需要,请告诉我。现在,我已经离开了。

td

getElement(s)通过方法并链接:

我们也可以更传统一些,并在表中循环tr / td,就像使用getElement(s)By method 一样,它可以在一定程度上链接(尽管我存储在变量中以便于比较)以上)

注意:

Option Explicit

Public Sub GetTable()
    Dim html As HTMLDocument, html2 As HTMLDocument, ws As Worksheet, i As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set html = New HTMLDocument
    Set html2 = New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://westgateselfstorage.com/index.php?page=estimator", False
        .send
        html.body.innerHTML = .responseText
    End With
    html.body.innerHTML = html.querySelector("#hiderow").outerHTML

    Dim headers(), rows As Object, results(), columns As Object
    headers = Array("Size", "Reg price", vbNullString, "Cash price", vbNullString, "Offers", "Reserve")
    'grab the rows
    Set rows = html.querySelectorAll("tr")
    ReDim results(1 To rows.Length, 1 To UBound(headers) + 1)
    For i = 1 To rows.Length - 1 'skip headers row
        html2.body.innerHTML = "<table>" & rows.item(i).outerHTML & "</table>"
        Set columns = html2.querySelectorAll("td")
        results(i, 1) = columns.item(0).innerText
        results(i, 2) = columns.item(3).innerText
        results(i, 4) = columns.item(4).innerText
        results(i, 6) = columns.item(5).innerText
        results(i, 7) = "Reserve this unit"
    Next
    ws.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
    ws.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub

基本上是链接到其中的单个元素(行)上

rows(i).getElementsByTagName("td")

例如

Set rows = hTable.getElementsByTagName("tr")

通过链接的第一行中的所有列。

VBA:

hTable.getElementsByTagName("tr")(0).getElementsByTagName("td")

答案 1 :(得分:0)

您可以为此使用python库pandas:

import pandas as pd

tabs = pd.read_html('http://westgateselfstorage.com/index.php?page=estimator', header =0)
tabs[0].drop(tabs[0].columns[2], axis=1)

您可能还想删除G列,因为那里的所有行都是相同的。