Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/28: Рейтинг темы: голосов - 28, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 1
1
Excel

Аналог функции importXML(google sheets) в Excel

24.08.2018, 02:00. Показов 5049. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Помогите найти альтернативу функции ImportXML из Гугл-таблиц в Экселе. Гугл режет скорость после 50 запросов. Поковырявшись в интернете, я понял, что встроенной функции, подобной ImportXML в Экселе нет, но ее можно написать в VBA. В VBA я еще пока полный дуб, но нашел вроде подходящий мне код. Почему то запуске функции, она выдает в ячейку ошибку #Имя. Возможно какие то библиотеки нужно подключать?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Function ImportXML(ByVal url As String, ByVal XPath As String) As Variant
On Error GoTo errHandle
    Dim pDoc As Object, t As Single, pNode As Object
    Set pDoc = CreateObject("MSXML2.DOMDocument")
    t = Timer
    pDoc.Load url
    Do Until (pDoc.readyState = 4) Or ((Timer - t) > 1)
        DoEvents
    Loop
    If pDoc.readyState <> 4 Then ImportXML = CVErr(XlCVError.xlErrRef): Exit Function
    Set pNode = pDoc.SelectSingleNode(XPath)
    If pNode Is Nothing Then ImportXML = CVErr(XlCVError.xlErrNull): Exit Function
    ImportXML = pNode.Text
Exit Function
errHandle:
    ImportXML = CVErr(XlCVError.xlErrNA)
End Function
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2018, 02:00
Ответы с готовыми решениями:

Перенос макроса из Excel в Google Sheets
Переносил таблицу из Экселя в Гугл, потерял очень ценный макрос Sub FOR_Umbreloss()...

Как ввести Функцию Importxml в Google Docs?
1. Есть Гугл таблица 2. Есть открытое Апи https://api.privatbank.ua/exchangerate.html 3. Есть...

Как из XLAM запустить Sheets().Copy Before:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Привет. Есть макрос, который копирует две эксель вкладки на активную книгу. При это макрос в файле...

Google Sheets
Всем привет. Не очень сильно разбираюсь в программировании, в связи с чем есть проблема: скрипт,...

11
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
17.08.2023, 14:40 2
Столкнулся с такой же проблемой, в VBA практически не шарю.
"Изваял" вот такую фигуру...

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub ExtractDataFromWeb()
    Dim URL As String
    Dim XMLHTTP As Object
    Dim HTMLDoc As Object
    Dim XPath As String
    Dim Elements As Object
    Dim Element As Object
    Dim Result As String
    
    ' Указываем URL и XPath
    URL = Range("B1").Value
    XPath = "//div[@class='col-6 col-md-2 d-flex align-items-end justify-content-end price']"
    
    ' Создаем объект XMLHTTP для выполнения HTTP-запроса
    Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    XMLHTTP.Open "GET", URL, False
    XMLHTTP.send
    
    ' Создаем объект HTMLDoc для работы с содержимым веб-страницы
    Set HTMLDoc = CreateObject("htmlfile")
    HTMLDoc.body.innerHTML = XMLHTTP.responseText
    
    ' Извлекаем элементы по XPath
    Set Elements = HTMLDoc.getElementsByTagName("div")
    For Each Element In Elements
        If Element.className = "col-6 col-md-2 d-flex align-items-end justify-content-end price" Then
            Result = Element.innerText
            Exit For
        End If
    Next Element
    
    ' Выводим результат
    Range("C1").Value = Result
    
    ' Очищаем объекты
    Set XMLHTTP = Nothing
    Set HTMLDoc = Nothing
End Sub
Из B1 берёт URL Применяет запрос //div[@class='col-6 col-md-2 d-flex align-items-end justify-content-end price']
Выдаёт результат в C1.

Мозги уже на бекрень.

Хочу сделать что бы макрос брал URL из G2 и XPath из I2, результат записывал в J2.
Если G3 не пустой, то макрас запускается ещё раз и выполняется для для 3й строки.
И так пока в столбце G не окажется пустой ячейки.

Но пока не знаю как это реализовать, так как я чайник. А колпак уже свистит...

Приложу файл в котором работал, может кто захочет попробовать помочь.
Вложения
Тип файла: xlsx Parcer.xlsx (9.9 Кб, 16 просмотров)
0
490 / 388 / 49
Регистрация: 08.02.2017
Сообщений: 1,559
17.08.2023, 17:24 3
Насчет этого
Цитата Сообщение от Supervisor26rus Посмотреть сообщение
Хочу сделать что бы макрос брал URL из G2 и XPath из I2, результат записывал в J2.
Если G3 не пустой, то макрас запускается ещё раз и выполняется для для 3й строки.
И так пока в столбце G не окажется пустой ячейки.
Насчет остальной работоспособности не знаю, все эти XML, HTML неизвестная магия
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub Parsing()
    Dim i&, lastRow&, arrIn(), arrOut()
    
    lastRow = Columns(7).Find(What:="*", SearchDirection:=xlPrevious).Row
    arrIn = Range(Cells(2, 7), Cells(lastRow, 9)).Value
    ReDim arrOut(1 To lastRow - 1, 1 To 1)
    
    For i = 1 To lastRow - 1
        arrOut(i, 1) = ExtractDataFromWeb(CStr(arrIn(i, 1)), CStr(arrIn(i, 3)))
    Next
    
    'Вывод результата в 10 столбец "j"
    Range(Cells(2, 10), Cells(lastRow, 10)).Value = arrOut
End Sub
 
Function ExtractDataFromWeb(URL$, XPath$)
    Dim XMLHTTP As Object
    Dim HTMLDoc As Object
    Dim Elements As Object
    Dim Element As Object
    
    ' Создаем объект XMLHTTP для выполнения HTTP-запроса
    Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    XMLHTTP.Open "GET", URL, False
    XMLHTTP.send
    
    ' Создаем объект HTMLDoc для работы с содержимым веб-страницы
    Set HTMLDoc = CreateObject("htmlfile")
    HTMLDoc.body.innerHTML = XMLHTTP.responseText
    
    ' Извлекаем элементы по XPath
    Set Elements = HTMLDoc.getElementsByTagName("div")
    For Each Element In Elements
        If Element.className = "col-6 col-md-2 d-flex align-items-end justify-content-end price" Then
            ExtractDataFromWeb = Element.innerText 'Возврат результата функцией
            Exit For
        End If
    Next Element
End Function
Добавлено через 1 час 30 минут
Более правильный (рабочий) вариант
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub ExtractDataFromWeb2()
    Dim i&, lastRow&, arrIn() ', arrOut()
    Dim URL$, XPath$
    Dim XMLHTTP As Object
    Dim HTMLDoc As Object
    Dim Elements As Object
    Dim Element As Object
    
    Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' Создаем объект XMLHTTP для выполнения HTTP-запроса
    Set HTMLDoc = CreateObject("htmlfile")                 ' Создаем объект HTMLDoc для работы с содержимым веб-страницы
    lastRow = Columns(7).Find(What:="*", SearchDirection:=xlPrevious).Row
    arrIn = Range(Cells(2, 7), Cells(lastRow, 9)).Value
    ReDim arrOut(1 To lastRow - 1, 1 To 1)
    
    For i = 1 To lastRow - 1
        URL = arrIn(i, 1)
        XPath = Mid(arrIn(i, 3), 15, Len(arrIn(i, 3)) - 16)
        
        XMLHTTP.Open "GET", URL, False
        XMLHTTP.send
        
        HTMLDoc.body.innerHTML = XMLHTTP.responseText
        
        Set Elements = HTMLDoc.getElementsByTagName("div") ' Извлекаем элементы по XPath
        For Each Element In Elements
            If Element.className = XPath Then
'                arrOut(i, 1) = Element.innerText
                Cells(i + 1, 10) = Element.innerText       ' Вывод результата в столбец "j"
                Exit For
            End If
        Next Element
    Next i
'    Range(Cells(2, 10), Cells(lastRow, 10)).Value = arrOut
End Sub
1
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
23.08.2023, 16:18 4
Цитата Сообщение от testuser2 Посмотреть сообщение
Более правильный (рабочий) вариант
Я стал играться с этим макросом, увеличил количество строк, соответственно и запросов.
Макрос отработал и дал часть данных! Это уже гигантский прогресс!

Результат приложу.

Однако некоторые запросы так и остались без ответа. В файле всё видно.
Может будет желание закрыть вопрос "с importXML(google sheets) в Excel".
Я так понял тема весьма актуальная, и на сегодня не имеет открытого решения.
Вложения
Тип файла: xlsx Parcer1.xlsx (47.2 Кб, 15 просмотров)
0
490 / 388 / 49
Регистрация: 08.02.2017
Сообщений: 1,559
23.08.2023, 17:22 5
Supervisor26rus, в первоначальном примере не было ни чего про теги span, dd, p и т.д. был только div можно конечно этот момент доработать.

Добавлено через 49 минут
С тегом p как я понял видимо идет не правильный XPath или может быть тег не тот.. Среди его подэлементов нет с классом "typography heading v2 -no-margin"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub ExtractDataFromWeb2()
    Dim i&, lastRow&, arrIn()
    Dim URL$, XPath$, Tag$, pos&
    Dim XMLHTTP As Object
    Dim HTMLDoc As Object
    Dim Elements As Object
    Dim Element As Object
    
    Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' Создаем объект XMLHTTP для выполнения HTTP-запроса
    Set HTMLDoc = CreateObject("htmlfile")                 ' Создаем объект HTMLDoc для работы с содержимым веб-страницы
    lastRow = Columns(7).Find(What:="*", SearchDirection:=xlPrevious).Row
    arrIn = Range(Cells(2, 7), Cells(lastRow, 9)).Value    
    
    For i = 1 To lastRow - 1
        URL = arrIn(i, 1)
        pos = InStr(3, arrIn(i, 3), "[")
        Tag = Mid(arrIn(i, 3), 3, pos - 3)
        pos = InStr(pos, arrIn(i, 3), "'")
        XPath = Mid(arrIn(i, 3), pos + 1, Len(arrIn(i, 3)) - pos - 2)
        
        DoEvents
        XMLHTTP.Open "GET", URL, False
        XMLHTTP.send
        
        HTMLDoc.body.innerHTML = XMLHTTP.responseText
        
        Set Elements = HTMLDoc.getElementsByTagName(Tag) ' Извлекаем элементы по XPath
        For Each Element In Elements
'            Debug.Print Element.className
            If Element.className = XPath Then
                DoEvents
                Cells(i + 1, 10) = Element.innerText     ' Вывод результата в столбец "j"
                Exit For
            End If
        Next Element
    Next i
End Sub
0
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
23.08.2023, 17:26 6
Цитата Сообщение от testuser2 Посмотреть сообщение
в первоначальном примере не было ни чего про теги span, dd, p и т.д.
Я думал что это входит в запрос XPath... Просто до этого делал в "Google sheets", собственно оттуда запросы и были скопированы.
0
490 / 388 / 49
Регистрация: 08.02.2017
Сообщений: 1,559
23.08.2023, 18:41 7
Supervisor26rus, и что в "Google sheets" все работало? Вообще в запрос в коде vba входит только URL, а XPart используется как "якорь" нужной информации.

Добавлено через 1 час 0 минут
Действительно тег и класс правильный. Но там видимо, страница формируется скриптом.
Так выглядит ответ запроса.
HTML5
1
<!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta name="robots" content="noindex,nofollow"><meta name="viewport" content="width=device-width,initial-scale=1"><link href="/cdn-cgi/styles/challenges.css" rel="stylesheet"></head><body class="no-js"><div class="main-wrapper" role="main"><div class="main-content"><noscript><div id="challenge-error-title"><div class="h2"><span class="icon-wrapper"><div class="heading-icon warning-icon"></div></span><span id="challenge-error-text">Enable JavaScript and cookies to continue</span></div></div></noscript></div></div><script>(function(){window._cf_chl_opt={cvId: '2',cZone: 'www.vseinstrumenti.ru',cType: 'managed',cNounce: '5943',cRay: '7fb459983ca69d93',cHash: '9bf3e2468262c01',cUPMDTk: "\/product\/svetodiodnaya-lampa-ecola-g4-led-1-5w-corn-micro-220v-2800k-320-35x10-g4rw15elc-4158216\/%23searchQuery=4RW15ELC&searchType=srp?__cf_chl_tk=UZGjLGu8ruHDZd0vLZqy8doLgAbZAwis7e6KgjFbk0U-1692804135-0-gaNycGzNCuU",cFPWv: 'g',cTTimeMs: '1000',cMTimeMs: '0',cTplV: 5,cTplB: 'cf',cK: "",fa: "/product/svetodiodnaya-lampa-ecola-g4-led-1-5w-corn-micro-220v-2800k-320-35x10-g4rw15elc-4158216/%23searchQuery=4RW15ELC&amp;searchType=srp?__cf_chl_f_tk=UZGjLGu8ruHDZd0vLZqy8doLgAbZAwis7e6KgjFbk0U-1692804135-0-gaNycGzNCuU",md: "KSR7tpUzz23h4D1pRvbjlhO0s64_uF9jF8dlHekHhuw-1692804135-0-AaEpC3rbUStWeWB85hgG96TTAthzpyppAc-6eBeiWOl5uW0XAmrxG1pAhZIEbLaO3vVRu05qSiK4mL7qT83qaMBEQzoJxEL57d7GuepCeCtZbOCCq7iw3E6lyK1aBKpusgoHo6wDcyw216wMVRBlP9qqE9HG6L7p8WUNjtwT8KPBo6DTtn2K4buNN6w9Z6s-9m3az8jHOvA02XjUGOR6J2F-RaKvxaD6wNL7BixJFPYD3AfAabEoWcdftUT-OaNu-kZ_f2tQHEMog8VqPKaMsDLqaedqPesdWnG90K4QmoikjcILAkzvd3RbLUN9dg1YWM6CHhpmYwiZ5wyQqYq9QvPtMzBZ-YEW9jUaIhIFfufOa8ph-aQeU-vJL7YloLBKO0Cw_vV2_MvusYbg5Lp5-REaKPSSYumDBPJtJuje7N750kBcq1ZJ1jObhoX6zDG4_LHPbfpY724iIhUo9bEMS-YbQl5YtKtcRK-b5l15kZCq9vV1EzAJtoyvvuc4kyDqQgdBhNLZa3ZRcJTYdw1JfwOxeuyVyKJ637XDZ83TNH-A51g_Iv-jDXrbI53bJ9OOqN3KlXwsdZrlBi4q-97LIXN1vqXmVdNMD0EZ9fRhK88eT_YguoIhTTT1UPvdg5gwX-wijnUR7nwtou6Blvg8GDgPiaLzAoKqo8ThoQzjVsKr-4KiQw6too5frGOD-_LNAD_6YIAwldj61R1DI5ViOzjWEAYMmz6KTcLBzwDQR5-TKCDvC45FCVdXE4jHV32WjyLaGuG1gu8lc_rHGxzhkOxWwXPNj4GdkRTtsHX7XMxpuxUDlyeasPjk4IpgXiiX4ScvuVaXO9j_EzwaWDQH85ROiWZYv_fFY_zp5j5On-1vZFgwcxKNy5FGQfzfUxd92YRUdz09jNWPtkRdJhdvQ6UXDuNxQ9YNMqZPkadiwUGgyS8vdahkqwgcqaiyy7VQ_tNH9uGDIqfl298CPirqy44pp2Muc26hAIVT2zzewD0ENh2FKUiVHS9U8VEnLgyFRL5Q5W7CAj_aqJ20dAvv0F-14Lxcyde0UVkmg3r7Mehi7W0NcBsJNQK1LCcdCFIoaY4SvmWJcx_kGuHPTz0LADNnRWmxIwubMVfiuXDa6Rl9WNfJQCgFlJ7J9n96TInlT35PJBPu6rf26Jbrp2mvjh9bYXbMF02JlUrGJ0WOYqYJlFvOVRd5J410lIaz7dy1sREEDvJz7bkB7ZywyJSywUITYo-1wLG-yqo1kR4ZkPz_2aZiaLWB9lVSktRoLu7asbzDljUrENVE7ypddH116zCXG6vjnv471FtdXM5sTO4cDm4IKbg_n9MSdugFnW6kGXjzDhp0WcMDBOpp3lC6ieoTTtJTHLRWQ9mwUJn2it7EWFQAn8nyz9KFehBIxxIbsFatAHvhmUwsngv88-eS3kKPWU_KaqCDR_hAaJvyWAs8DEmHpPGJVLGwx_sC8JNT-qA7i5T1KEOz7PAX8nn9fM-DsXYAISelsLalBqSZBBYzZ4n4C3vACxlPKA7bXS_KtKmRnQDcD723-KL7ylgHetbb7ATqkqo3emyZrEu2dHtsR11AbvSPQlsFNIA0JubBlplcjipDiKV_R8DHJRTWxSTMNOpecv7LXhzVb_gCOja4JXfEBAZte0zMaCHq88WOeXGTCNWo-Sp4d_zbGlV7cEHmqtu2Iw-wc-uBe9kzvRRRWCZuwGaAEV6VM03z-ClhAjmgX7U7xlSHH8iYnhC85iD0g2ib9pV86djnkueFKBNxMYHoAg6HG0VxCSdwcKiaoATCusEadWzEEl0lJG5bUfhhm1Y6gNzpb6L0hA4HQ9MxEn-qYrvs9PY8XM-edYcKqL0s_1KkcDkkoV1SOZ9hSr5NLw_GFRwiT2E9VZuPj2x4G4tv-jBcyZSvWHEVzpLBB4b0Ah18dR9HDMVQXg_uzHx80uLM8K-lY4y3w-tdSIUFAOSeI9FxmLcr42wx-qdAbYb_JpqUn2FafchE2orw-MssBD8S3m-iieMefFxH051_DHvpQh8JcqsGXYkch58z7Lj5ggkwr3V6vv2nQWZO25qZNzStN_Ozm1Db3ymu6C4Or1r1DkGiBwmoW5GeIla7qRVKRrysECq_7eOCT9c51hxdBQGMk1rq5kNUXpH2OU1I7O5mqceI8DsP7IRtrpJ9FbL2-QqaS0KmEllQgawRuKfom9TodfnTSGIcSwMPIN4_fQhb-lhpMJXFhuhaJ6M5PeX0fV8lndDnuiivRg9OQRNyTHL71TVkk-HskuFdHve8dZOTwVpg0XhVdPU2KZ5uFsRNSNDC3YCwYF_MAIyChG1Kvh00aATCz2KEgP0zmMaqiyWRwFwwSM5HZU1DGFIIBSfg7kV2VbONhpQIpr7_2wvRc7SrO3b1uj-icoQDU9Hv8H-rCUqgAb_wDESXbmKdHXtSYAt4TGcLc5vS_Wf0z-IqHBNEsg0tGLZP2fmPvk7menwJFMXnGXXYW4X4oH41-DgLyt7VP1v9GY6RDU4mXsW2HX9tlonu8IG-CigoIDEdR36ZSVrxqlUFT0EzuQVdip9hmbatA4pHwcTgHet8EVzNs-7LlCAxtTEb9qHzdfLkEmwxWo-a2HHUB-G59TpqopfgLAV7FZFac_t2vpKpQsuEyYVPiivAnt2EN0EtgZYjAN0blVNagv73zg2hYIBxer4f20CjN4mFvfTrTFJyG7A4yqdFAx6txILsg1-9JzXh",cRq: {ru: 'aHR0cHM6Ly93d3cudnNlaW5zdHJ1bWVudGkucnUvcHJvZHVjdC9zdmV0b2Rpb2RuYXlhLWxhbXBhLWVjb2xhLWc0LWxlZC0xLTV3LWNvcm4tbWljcm8tMjIwdi0yODAway0zMjAtMzV4MTAtZzRydzE1ZWxjLTQxNTgyMTYvJTIzc2VhcmNoUXVlcnk9NFJXMTVFTEMmc2VhcmNoVHlwZT1zcnA=',ra: 'TW96aWxsYS81LjAgKGNvbXBhdGlibGU7TVNJRSA2LjA7IFdpbmRvd3NOVCAxMC4wKSk=',rm: 'R0VU',d: 'c9bJKhehhQAAHYpxpgfN3wpiLQU3ronepOgLhlTk3eDBVsF0ghGHp6pPf6CjjyfZ+3T0qqCyYuZtsp+axlCRKnmRrg64D22fKsJb8F1/PzXLVJq8oy4hyxhoM/dzlGkuWDrqISXkSO66GlC7/0cVzC8d5yKwWLxP8a4UQ/idQ9DA+XbM0TuR9FVMS9Pa7cUYbmoyB0teRSsUfwdqX4YlYNfMJEGdgB5E4XWwVOYKpgRjXkBaZ4mWTWGLplvPNmRC5GRg8BkZ62wB/i6JJfVfzI5dkWP3gxHsHbKmVSc3VD6iirTi5Jaw5ffYb6L0KW2+iKk7PelFANMKQmc7dspBEY5pUbA7l3R+urJugmlApTaJ+AAq48usjf8o5zNXeH8S0f3vGpzL6OuTI9KIcygfRBHzv5nc+CL7TVYw+Gt5bgxl5UKjFoQBbOqKYT60Mqy5RZvesneVcOCesQ+E82M3cCEXfuEOxqtDLy0PaKXCSNESpGU23HMpLA+eJnbPkDkqL1zF2EYo1HYhVV3kZR6uwC0bV45esHOvJxMRzfKg+VE=',t: 'MTY5MjgwNDEzNS43MTYwMDA=',cT: Math.floor(Date.now() / 1000),m: 'zIkMVd0TZRaWr/1p883MCiPlbB5lceKEUUqhFRX0ARs=',i1: 'hfcb147yuv6avEgOp0xb8w==',i2: '132QNU8SPl9LVKUIo3QfWw==',zh: 'ii/2WDdRZKVg4JcFqLKAddIht7KCiERS9jsaUHRlQ6U=',uh: '4h2hVhcJeLT87jw92NUs2LXug1EmndahHwMuheb22BE=',hh: 'GAtg8D/Ni+X38Kn1XNPOd7FWRlglim3dmxDGj5uzvjs=',}};var cpo = document.createElement('script');cpo.src = '/cdn-cgi/challenge-platform/h/g/orchestrate/chl_page/v1?ray=7fb459983ca69d93';window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;if (window.history && window.history.replaceState) {var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;history.replaceState(null, null, "\/product\/svetodiodnaya-lampa-ecola-g4-led-1-5w-corn-micro-220v-2800k-320-35x10-g4rw15elc-4158216\/%23searchQuery=4RW15ELC&searchType=srp?__cf_chl_rt_tk=UZGjLGu8ruHDZd0vLZqy8doLgAbZAwis7e6KgjFbk0U-1692804135-0-gaNycGzNCuU" + window._cf_chl_opt.cOgUHash);cpo.onload = function() {history.replaceState(null, null, ogU);};}document.getElementsByTagName('head')[0].appendChild(cpo);}());</script></body></html>
Добавлено через 6 минут
Я еще юзер-агент добавлял. Взял отсюда.
Visual Basic
1
2
XMLHTTP.setrequestheader "User-Agent", "Mozilla/5.0 (compatible;MSIE 6.0; WindowsNT 10.0))"
XMLHTTP.send
А вот если указать какой-нибудь древний юзер-агент или мобильный, то может и выдаст нужные данные
0
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
23.08.2023, 19:38 8
Цитата Сообщение от testuser2 Посмотреть сообщение
Но там видимо, страница формируется скриптом.
Убрал из ссылок участки формата → "#searchQuery=4RW15ELC&searchType=srp"
И с этих сайтов, тоже пришли результаты.

Остались 12 результатов, которые не обрабатываются.
Их отличает одна черта, после закрывающейся квадратной скобки с указанием класса имеется указание конкретного тега.
Получается указан тег внутри другого тега.

Если убрать их, то к примеру с ECOLA подтягивается лишнее.
Приложил скрин1

А ещё 2 сайта (DivineLight и HiTE-PRO) и вовсе требуют тройной вложенности, для точного попадания в нужный (конкретный тег).
Там повезло, много товаров и у всех цена в теге p[@class='price'] либо div[@class='price-block'], но нужный идёт первым.
Так что подтягивается нормально. Но если каким-то образом нужная цена будет стоять второй на странице, то это вызовет не тот результат.

Вот и вопрос, может для VBA нужно немного подругому XPath прописывать, что бы писать более точный
Цитата Сообщение от testuser2 Посмотреть сообщение
"якорь"
0
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
23.08.2023, 19:50 9
Забыл приложить
Миниатюры
Аналог функции importXML(google sheets) в Excel   Аналог функции importXML(google sheets) в Excel  
Вложения
Тип файла: xlsx Parcer4.xlsx (49.5 Кб, 16 просмотров)
0
490 / 388 / 49
Регистрация: 08.02.2017
Сообщений: 1,559
24.08.2023, 07:38 10
Цитата Сообщение от Supervisor26rus Посмотреть сообщение
может для VBA нужно немного подругому XPath прописывать
Думаю можно заменить на просто участок html-кода перед нужной информацией. Допутим
HTML5
1
<p class="price"><span class="woocommerce-Price-amount amount"><bdi>
0
5 / 5 / 0
Регистрация: 19.02.2015
Сообщений: 130
24.08.2023, 10:12 11
Цитата Сообщение от testuser2 Посмотреть сообщение
можно заменить на просто участок html-кода
К сожалению, не сработало...
Нам нужен ещё один гений VBA, что бы закончить
0
490 / 388 / 49
Регистрация: 08.02.2017
Сообщений: 1,559
24.08.2023, 11:52 12
Проблема еще в том, что не тот код приходит, как в браузере
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub ExtractDataFromWeb3()
    Dim i&, lastRow&, arrIn()
    Dim URL$, XPath$, XPtArr$(), rsTxt$, j&, pos&
    Dim XMLHTTP As Object 'IServerXMLHTTPRequest2
    Dim HTMLDoc As Object 'HTMLDocument
    Dim Elements As Object 'DispHTMLElementCollection
    Dim Element As Object
    Dim xmldoc As Object 'DOMDocument
    
    Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
    Set XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0") ' Создаем объект XMLHTTP для выполнения HTTP-запроса
    Set HTMLDoc = CreateObject("htmlfile")                 ' Создаем объект HTMLDoc для работы с содержимым веб-страницы
    lastRow = Columns(7).Find(What:="*", SearchDirection:=xlPrevious).Row
    arrIn = Range(Cells(2, 7), Cells(lastRow, 9)).Value
    
    For i = 1 To lastRow - 1
        URL = arrIn(i, 1)
        XPath = XMLToHtmlXPath(CStr(arrIn(i, 3)))
        XPtArr = Split(XPath, "]")
                
        DoEvents
        XMLHTTP.Open "GET", URL, False
        XMLHTTP.send
        
        rsTxt = XMLHTTP.responseText
        
        pos = 1
        For j = 0 To UBound(XPtArr) - 1
            pos = InStr(pos, rsTxt, XPtArr(j), vbTextCompare)
        Next
        
        If pos Then
            pos = InStr(pos, rsTxt, ">") + 1
        Else
            MsgBox "Неправильный ответ сервера"
            GoTo Continue
        End If
        
        DoEvents
        Cells(i + 1, 10) = Mid(rsTxt, pos, InStr(pos, rsTxt, "<") - pos)
        
Continue:    Next i
End Sub
Добавлено через 52 минуты
Visual Basic
1
2
3
4
5
6
Function XMLToHtmlXPath$(XPath$)
    XPath = Replace(XPath, "/", "<", 2)
    XPath = Replace(XPath, "[@", " ")
    XPath = Replace(XPath, "'", """")
    XMLToHtmlXPath$ = XPath
End Function
0
24.08.2023, 11:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2023, 11:52
Помогаю со студенческими работами здесь

Python and google sheets
Добрый день. Подскажите в чем может быть проблема? def googleapi(): scope = ff = { ...

Google Sheets API
Добрый день, возник вопрос по гугл шитс апи) Необходимо сделать POST-запрос, при этом надо, чтобы...

Парсинг ячеек из google sheets
Здравствуйте,нужна помощь.Есть php код типа: Function FOP(){...

Работа с таблицей в Google Sheets
Всем добрый день Возникла следующая задача- существует два столбца В первом, определенные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru