Web-скребки для Table Formate - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь скопировать данные из форматов TD и TR.Я новичок в очистке данных, поэтому я не нашел никаких результатов в поиске Google.

Я хочу скопировать все размеры блока (пример 5 * 5) в столбце «A», Обычная цена в «B», НаличныеЦена «D», первые 3 месяца скидка 50% (предложения) в столбце «F» и резерв в столбце «G».

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

Честно говоря, я не могусоздать код, чтобы мне было бы полезно, если бы кто-то помог мне создать код.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Буфер обмена

Вы заботитесь о макете? Вы можете копировать напрямую через буфер обмена и иметь такой же макет, как страница

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, нам нужно добавить теги table в html, чтобы querySelectorAll мог выбрать td s внутри строки, то есть столбцы .

Теперь я не отделил старую цену от сниженной цены в столбце «Наличная цена». Если вам это нужно, просто дайте мне знать. На данный момент я оставил оба.

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

getElement (s) По методу и цепочке:

Мы могли бы также быть более традиционными и использовать цикл tr / td внутри таблицы, как с getElement (s). метод позволяет нам в некоторой степени связывать цепочки (хотя я храню переменные, чтобы их было легко сравнивать с выше)

Примечание:

rows(i).getElementsByTagName("td")

в основном связан с отдельным элементом (строкой) в

Set rows = hTable.getElementsByTagName("tr")

, например

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

Все столбцы в первом ряду через цепочку.

VBA:

Option Explicit
Public Sub GetTable()
    Dim html As HTMLDocument, hTable As HTMLTable, ws As Worksheet, i As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    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
    Set hTable = html.getElementById("hiderow")

    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 = hTable.getElementsByTagName("tr")
    ReDim results(1 To rows.Length, 1 To UBound(headers) + 1)
    For i = 1 To rows.Length - 1 'skip headers row
        Set columns = rows(i).getElementsByTagName("td")
        results(i, 1) = columns(0).innerText
        results(i, 2) = columns(3).innerText
        results(i, 4) = columns(4).innerText
        results(i, 6) = columns(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
0 голосов
/ 04 июня 2019

Для этого вы можете использовать библиотеку панд Python:

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, поскольку все строки там идентичны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...