我正在尝试从TD和TR格式复制数据。我是数据抓取的新手,所以我没有在Google搜索中找到任何结果。
我要在“常规”的“ A”列中复制所有单位尺寸(例如5 * 5) “ B”中的价格,“ D”中的现金价格,“ F”中的前三个月50%的折扣(优惠)和“ G”列中的储备金。
http://westgateselfstorage.com/index.php?page=estimator
坦率地说,我无法对代码进行框架设计,因此,如果有人帮助我构建代码,这对我真的很有帮助。
答案 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列,因为那里的所有行都是相同的。