Настройка функции, которая вытягивает таблицу с веб-страницы, чтобы вытащить только один элемент + повтор - PullRequest
1 голос
/ 06 марта 2020

У меня странный проект, который я пытаюсь осуществить. По сути, у меня есть инструмент, который создаст обширную электронную таблицу всего инвентаря определенного c раздела склада. Он перечисляет их местоположение, состояние инвентаря и идентификатор предмета («ASIN», который в основном является его штрих-кодом и виртуальной ссылкой во внутренней системе. Проблема заключается в том, что он не перечисляет «скорость» (показатель c того, как многие из которых мы продаем в неделю) этих определенных c предметов, и я хотел бы распечатать этот показатель c рядом с каждым идентификатором предмета, чтобы я мог разобрать, что не продается, и отправить его на длительный срок. раздел хранилища терминов склада. Я нашел другой инструмент, который получает таблицу информации об отдельном идентификаторе элемента из нашей внутренней вики («FCresearch»), которая содержит этот параметр c metri c. пытаясь получить только скорость элемента из этой таблицы (по существу, число, которое находится в этом месте:

/html/body/div[2]/div/div[1]/div/div[1]/div/div[2]/div/div/div[2]/table/tbody/tr[19]/td 

на веб-странице), а затем адаптировать этот макрос так, чтобы он воздействовал на ASIN в Таблица, созданная предыдущим инструментом, печатает ее скорость в соседнюю ячейку, затем перемещает строку вниз и повторяет для всех ~ 4000 записей, пока не достигнет пустой sp ace.

Вот полная соответствующая функция:

    Sub getFCresearch()
Dim A As Object, H As Object, D As Object, C As Object, asin$, B$, F$
Dim x&, t&
Set C = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set D = CreateObject("HTMLFile")
Set A = CreateObject("New:{00000566-0000-0010-8000-00AA006D2EA4}")
Set H = CreateObject("WinHTTP.WinHTTPRequest.5.1")
    H.SetAutoLogonPolicy 0

''passes badge
    H.Open "GET", "https://hrwfs.amazon.com/?Operation=empInfoByUid&ContentType=JSON&employeeUid=" & Environ("USERNAME")
    H.send

DoEvents

B = Split(Split(H.ResponseText, "employeeBarcode"":""")(1), Chr(34))(0)


    H.Open "POST", "http://fcmenu-iad-regionalized.corp.amazon.com/do/login"
    H.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    H.setRequestHeader "Content-Length", Len("badgeBarcodeId=" & B)
    H.send "badgeBarcodeId=" & B

DoEvents

H.Open "GET", "http://fcmenu-iad-regionalized.corp.amazon.com/" & F
H.send
DoEvents

''Needs to derive "asin" variable from adjacent cell
asin = Sheets("Sheet1").[A1]

''This gathers the specific item's page on the wiki "FCresearch"
H.Open "GET", "http://fcresearch-na.aka.amazon.com/DEN3/results/inventory?s=" & asin, False
H.send

'''This gets the whole table,where I only need one specific element called "velocity" at: /html/body/div[2]/div/div[1]/div/div[1]/div/div[2]/div/div/div[2]/table/tbody/tr[19]/td
D.body.InnerHTML = H.ResponseText
C.SetText D.GetElementById("table-inventory").OuterHTML
C.PutInClipboard

''This pastes the table to a different sheet, but needs to paste to a cell adjacent to the "asin" variable of each row
''Before moving down to the next row and repeating the process
Sheet2.[C:Z].Cells.ClearContents
Sheet2.[C1].PasteSpecial

Sheet2.[C:N].WrapText = False
Sheet2.Columns("C:N").AutoFit
End Sub

Любая помощь, которую вы все можете оказать, была бы удивительной. Извиняюсь за то, что это такая обширная вещь, я довольно новичок в этом, и я только смог откорректировать незначительные вещи в коде, и я не смог найти документацию где-нибудь, которая может помочь глубже, чем функция .GetElementById это не работает на элементе html без идентификатора.

Изображение таблицы HTML, + обычный текст

 <table data-row-id="1579657885" class="a-keyvalue"><tbody><tr><th>ASIN</th><td><a href="/DEN3/results?s=1579657885">1579657885</a></td></tr><tr><th>Title</th><td><a target="_blank" href="http://www.amazon.com/gp/product/1579657885">1,000 Places to See Before You Die (Deluxe Edition): The World as You've Never Seen It Before</a></td></tr><tr><th>Binding</th><td>Hardcover</td></tr><tr><th>Publisher</th><td></td></tr><tr><th>Vendor Code</th><td>ATSAN</td></tr><tr><th>Weight</th><td>6.45 pounds</td></tr><tr><th>Dimensions</th><td>1.50 x 13.00 x 9.80 IN</td></tr><tr><th>List Price</th><td>USD 50.00</td></tr><tr><th>Expiration Date</th><td class=""></td></tr><tr><th>Asin Demand</th><td><a target="_blank" href="https://ufo.amazon.com/srw14na/asins/place_in_line/1579657885?warehouse=DEN3">Demand for 1579657885</a></td></tr><tr><th>Sortable</th><td>true</td></tr><tr><th>Conveyable</th><td>true</td></tr><tr><th>Very High Value</th><td>false</td></tr><tr><th>Master Case</th><td>false</td></tr><tr><th>FCSku Scope</th><td>FNSKU</td></tr><tr><th>Sales Forecast</th><td>4.0</td></tr><tr><th>Sales History (approx)</th><td>5.0</td></tr><tr><th>Sales Override</th><td>0.0</td></tr><tr><th>ASIN Velocity (approx)</th><td>5.0</td></tr><tr><th>Provenance Value</th><td>UNTRACKED</td></tr><tr><th>Provenance IOG</th><td>Info Not Found</td></tr></tbody></table>

1 Ответ

0 голосов
/ 06 марта 2020

Хорошо, вот два способа получить необходимую информацию. Если вы понимаете логику c, я считаю, что любой комбинации этих методов должно быть достаточно для настройки кода в соответствии с вашими потребностями.

Для простоты я буду предполагать, что HTML уже загружен в HTMLDocument объект с именем D. Значение интереса будет напечатано в вашем ближайшем окне для демонстрационных целей.

Во-первых, вам нужна ссылка на Microsoft HTML Object Library (VBE> Инструменты> Ссылки> ...).

I ' Я буду использовать следующие переменные:

Dim table As HTMLTable
Dim tableOfInterest As HTMLTable
Dim row As HTMLTableRow
Dim rowOfInterest As HTMLTableRow
Dim cell As HTMLTableCell 'not using it but you could in a For-Each
Dim cellOfInterest As HTMLTableCell 

Предполагая, что индекс таблицы, индекс строки и индекс ячейки всегда одинаковы, и вы их знаете:

Set tableOfInterest = D.getElementsByTagName("table")(0) 'Assuming the table of interest is the first table to appear in the HTML document. Keep in mind indexing starts at zero!
Set rowOfInterest = tableOfInterest.getElementsByTagName("tr")(18) 'Assuming the row of interest is the 19th row in the table.
Set cellOfInterest = rowOfInterest.getElementsByTagName("td")(0) 'Assuming the cell of interest is the 1st cell in the row.
Debug.Print cellOfInterest.innerText

Предполагается, что вы не знаете явно индекс таблицы и строки, но знаете другую информацию, такую ​​как атрибуты или внутренний текст

For Each table In D.getElementsByTagName("table")
    If table.Attributes("data-row-id").Value = "1579657885" Then 'assuming the value of this attribute is always the same
        Set tableOfInterest = table
    End If
Next table

For Each row In tableOfInterest.getElementsByTagName("tr")
    If row.innerText Like "*ASIN Velocity (approx)*" Then 'assuming that's the text you're looking for
        Set rowOfInterest = row
    End If
Next row
Debug.Print rowOfInterest.Cells(1).innerText 'in this case the "th" element is also considered a cell so the cell you're interested in is the 2nd one.

Другой метод, который используется, когда идентификатор отсутствующим будет .getElementsByClassName(). Работает с теми же логиками c .getElementsByTagName().

...