Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
23.09.2018, 11:50
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Всем доброго времени суток! Понимаю, что я не первый с таким вопросом, но ковыряюсь уже неделю, понимаю что истина где то рядом, но никак не могу ее найти. Суть такая: есть определенная таблица с наименованием товара, допустим, есть в таблице ссылки на эти товары, нужно с двух-трех сайтов тянуть их цену, цены в коде представлены так: <span class="goldPrice" data-unit-price="385" data-default-price="385">385</span>. Перебрал множество тем посвященных парсингу на vba, но так ничего путного не нашел. В этой теме http://www.sql.ru/forum/360384-1/kak-vytashhit-dannye-s-web-stranicy есть код, но не пойму как его подкрутить под свою задачу. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 11:56
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Конечно, при серьезной работе следовало бы работать с DOM или использовать RegExp, но в данном простейшем случае, что именно вызывает затруднение? Нашел подстроку <span class="goldPrice" data-unit-price="забрал все, что после нее и до следующей кавычки, да и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 12:07
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Проблема в поверхностном знании vba, вот допустим взять код, который я выше дал, понимаю что он перебирает ссылки в ячейках, а как сделать чтоб он находил то, что надо и записывал куда надо не пойму. Пробовал ковырять методом webpagetext, получается весь текст со страницы тянет... На DOMe немного проще было бы, но нужно именно в excel сделать ввиду некоторых обстоятельств. Причем в гугл таблицах при помощи IMPORTXML все легко, но проблема что если больше 50 позиций то все помирает... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 12:28
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
в переменной "s" находится нужный текст (?) для того, чтобы найти в нем нужный фрагмент, понадобится функция Instr, вырезать из него нужный фрагмент - функция Mid. Описание этих функций и примеры их использования смотрите в справке, пишите код, если он не заработает - публикуйте - подправим. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 17:41
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Спасибо, почитал, только не могу найти примеры с использованием этих функций для парсинга, везде в примерах показано как локально найти символ или строку. Вот пример взят с сайта майкрософт: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Если я правильно понимаю, то в мое случае код должен выглядеть примерно так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Пробовал экспериментировать, теперь код ругается на 4 строку, пишет out of range, в общем голова кругом... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 17:54
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Ну так вам нужно искать не единственный символ, а строку (выше я выделил, какую именно) eshkinkotтеперь код ругается на 4 строку, пишет out of rangeСкорее всего потому, что в ячейке А1 текущего листа у вас больше нет гиперссылки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 18:29
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
то есть SearchChar не нужна? оставляю SearchString там прописываю начало строки? Код: vbnet 1. 2. 3.
так? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 18:41
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Нет. SearchString - это ГДЕ искать, то есть s Вместо SearchChar - ЧТО искать - то есть нужная подстрока. И не забудьте, что когда записываете литеральную строку, заключенную в кавычки, кавычки входящие в нее должны удваиваться ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 19:07
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Немного начинаю понимать, но в приведенном выше коде S приравнена к o.responseText и в первоначальном коде она возвращает в msgbox, но мне не нужен он, мне нужно чтоб просто переходила по ссылке, находила заданную строчку, брала оттуда то что нужно и записывала в определенную ячейку... Соответственно если я все правильно понимаю переменная s при выполнении кода выдает мне только текст, там нет того что мне нужно, соответственно должно наверное получиться так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 19:09
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Не получилось... все равно в msgbox выдает только текст ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 19:21
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkotСоответственно если я все правильно понимаю переменная s при выполнении кода выдает мне только текст, там нет того что мне нужно,Я перестаю понимать. Я не могу знать, есть ли в переменной s нужный вам текст (<span....), так как у меня нет ваших ссылок. Если нужного текста там нет, то что мы тогда пытаемся искать? Далее: eshkinkot Код: vbnet 1.
Тут вы пытаетесь присвоить переменной SearchString строку "s". Наверное это не то, что вы хотели. Вам вообще не нужна SearchString, у вас уже есть переменная s. Далее, от того, что вы воспользовались Instr, сама переменная s никак не изменится, так что MsgBox вам ничего нового не даст. Вам требуется найти позицию начала нужного вам фрагмента, потом позицию конца фрагмента, а потом вырезать его из s с помощью функции Mid ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 20:05
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
ммм... для более полного понимания распишу все по полочкам. Есть таблица в excel, в ней есть столбцы с наименованием товара, в соседнем столбце есть ссылка на сайт, в следующем столбце необходимо вывести цену с сайта, которая заключена здесь: <span class="goldPrice" data-unit-price="385" data-default-price="385">385</span>. Код выше не мой, его нашел на этом сайте, мне показалось что он наиболее подходит. В переменной s исходя из того, что выводит msgbox цены товара нет. тестирую по этой ссылке https://tver.petrovich.ru/catalog/17333/106958/ ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 20:57
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkot, примерно так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.09.2018, 21:11
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
спасибо большое! буду изучать и допиливать))) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.09.2018, 10:53
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Казанский, все отлично работает, но как реализовать поддержку нескольких сайтов? сейчас он смотрит ссылку в А1, кладет в В1, как реализовать чтоб он смотрел потом С1 клал в D1 и т.д.? Дублировать модуль? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.09.2018, 11:05
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkot, код смотрит в А1:А20 - это в вашем исходном коде было - и кладет в В1:В20. Если у Вас все в первой строке через одну ячейку, то так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.09.2018, 11:36
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Спасибо, но это если мы парсим один сайт, а если допустим А1 - один сайт, С1 - второй сайт, D1 - третий? соответственно строчка <span class="goldPrice" data-unit-price=" будет для каждого сайта своя. Замучил наверно вас уже) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.09.2018, 11:40
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkotсоответственно строчка <span class="goldPrice" data-unit-price=" будет для каждого сайта своя.И много у вас еще тузов в рукаве? Ну размещайте эту строчку в соседней ячейке со ссылкой ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.09.2018, 11:49
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Shocker.Proeshkinkotсоответственно строчка <span class="goldPrice" data-unit-price=" будет для каждого сайта своя.И много у вас еще тузов в рукаве? Ну размещайте эту строчку в соседней ячейке со ссылкой Нет) Тузы все вышли) просто на одном сайте цена прячется здесь: <span class="goldPrice" data-unit-price=" , в другом сайте <div class="price_wrap"><ins>455,00 <span class="rouble"></span></ins><p>шт. (40 в упаковке)</p></div>, и в третьем сайте <span class="card-order-price-int" itemprop="price" content="385.00">385</span> ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2018, 19:24
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Shocker.Pro, суть понял, делаю так: в первой ячейке даю ссылку, во второй переменную которую надо искать. Тогда, как мне подсказывает сайт майкрософт, я должен свой код привести к следующему виду: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Но тогда получаю ошибку: Constant expression required, ругается на .select, что делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2018, 19:39
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkot Код: vbnet 1.
метод тыка - плохой помощник. Понимаете, либо мне сейчас понадобится изложить пару глав учебника, чтобы объяснить, что вы делаете не так и что надо делать, либо написать программу за вас, но тогда вы захотите этого постоянно и будете обращаться все за новыми и новыми задачами. Вам Казанский написал рабочую программу, но вы даже не удосужились досконально разобраться, как она работает. Начните с этого хотя бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.09.2018, 20:40
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
В коде Казанского все логично: Объявляем константу, в которой прописываем часть необходимой строки поиска, дальше объявляем переменные, в следующей строке задаем цикл(число ячеек для просмотра ссылок) Дальше смотрим ячейку, берем гипер ссылку, открываем страницу, выдираем то, что нужно и переходим к следующей ссылке, возвращая в текстовом формате нужную инфу. Это как я понимаю этот код, ибо являюсь самоучкой и к сожалению приходится учиться методом тыка. Так же понимаю что в константе нужно задать не фрагмент кода, а диапазон ячеек... А как это сделать не могу понять, так как справка толком ничего не объясняет, а в инете примеров куча, но тяжело осмыслить как допилить под себя. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.09.2018, 05:20
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
eshkinkotк сожалению приходится учиться методом тыка.Кто вас заставляет? Литературы полно - принципиально учебники не читаете? eshkinkotТак же понимаю что в константе нужно задать не фрагмент кода, а диапазон ячеек..Плохо понимаете. Вообще неверно. Вы же ссылки, которые перебираете, в константу не запихиваете? Они у вас просто лежат в ячейках в столбце 2. Точно так же в столбце 3 будут лежать нужные строки для поиска. И обращаться вы будете к ним точно так же через Cells(i, 3) - не придумывайте лишнего. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.09.2018, 08:59
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Shocker.ProКто вас заставляет? Литературы полно - принципиально учебники не читаете? Вы будете смеяться, но учебники вроде читаю, вроде понятно, но информация не усваивается, быстрее учусь при разборе готового кода ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.09.2018, 09:55
|
|||
---|---|---|---|
|
|||
Парсер |
|||
#18+
Shocker.Pro, Поковырял немного код, вот что получилось: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Все работает, перебирает))) Но будьте добры, подскажите из трех сайтов показывает только два, у одного сайта цена прячется здесь: <div class="price_wrap"><ins>455,00 <span class="rouble"></span></ins> как мне из нее вытащить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=60&mobile=1&tid=2155002]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 431ms |
0 / 0 |