Добрый вечер, я совсем новичек в этом деле, начинаю с самого простого, но уже нужна помощь более опытных)
Помогите пожалуйста мне извлечь данные из сайта при некоторых условиях, а именно:
1 data-server=9792
2 data-side=52
3 data-online=1
если все эти 3 параметра совпадают - тогда нужно цену сохранить в файл, но вообще моя цель это сохранить самую дешевую цену из всех(что попали под 3 мои условия выше) в файл или переменную
<tr data-href="тутURL" data-server="9792" data-side="52" data-online="1"> <td>ServerAbc</td> <td>Orki</td> <td><div> <a href="тутURL/users/2323/">ProdavecVasia</a> <span class="label label-success">online</span> <a href="тутURL">ProdavecVasia</a> <span class="label label-success">online</span></div><div class="text-muted">на сайте год, 333 отзывов</div></td> <td class="text-right"> 49 </td> <td class="text-right" data-s="2"> <div>9.96 ₽</div> </td> </tr>
var macro; macro = "CODE:"; macro += "TAG POS=1 TYPE=TR ATTR=data-server:9792&&data-side:52&&data-online:1 EXTRACT=TXT " + "\n"; macro += "SAVEAS TYPE=EXTRACT FOLDER=D:\\Macros\\test FILE=+_{{!NOW:yyyymmdd_hhnnss}}" + "\n"; iimPlay(macro)
Отсутствует
Потратьте полчаса на изучение селекторов
querySelector и querySelectorAll
Знакомьтесь с методом getAttribute() для извлечения значений атрибутов
Вот ваши параметры по отдельности
var node = window.document.querySelector('tr[data-href]'); var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); // Значение цены var price = node.querySelector('.text-right>div').textContent; // Смотрим в консоль по ctrl + shift + k window.console.log(data_server); window.console.log(data_side); window.console.log(data_online); window.console.log(price); // Значение цены без лишнего символа window.console.log(price.match(/[0-9.]+/)[0]);
Отсутствует
спасибо за отклик, вы значительно подвинули меня к конечной цели)
ну я снова остановился на условии else
var node = window.document.querySelector('tr[data-href]'); var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1){ //проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]);} //вывожу цену если все ок по моим критериям else{ тут если не совпадает, хочу сказать чтобы скрипт проверял дальше, следующий var node, как это правильно писать? что почитать на эту тему? }
Отредактировано gødmøde (15-09-2019 14:18:46)
Отсутствует
Используйте циклы
var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1)//проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]); //вывожу цену если все ок по моим критериям }
Отсутствует
хотелось бы извлечь лишь самую дешевую цену, а не все, чтобы потом попробовать запилить проверку по нику "не принадлежит ли эта самая дешевая цена - мне" если цена моя, то обновляем страницу и поновой чекаем, ну а если цена не моя, а "ProdavecVasia" то там уже совсем другая история) туда пока еще я не дошел
var macro; macro = "CODE:"; var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var m_name = "godmode"; var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode)//проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]); }
(ReferenceError: godmode is not defined, line 12 (Error code: -991))
как правильно получить результат = самая низкая цена: как-то отрезать все что после первой строки с помощью регулярных выражений? или это можно как-то в циклах указать? чтобы после первой занесенной успешно (самой дешевой цены) остальное не чекать/сохранять в переменную price
Отредактировано gødmøde (15-09-2019 23:52:06)
Отсутствует
gødmøde
(ReferenceError: godmode is not defined, line 12 (Error code: -991))
вам же русским языком написано, нет такой переменной в вашем скрипте, если вы сверяете значение переменной name с текстом, текст обрамляется кавычками
как правильно получить результат = самая низкая цена
для сравнения значений, извлеките их в массив и отсортируйте:
чтобы после первой занесенной успешно (самой дешевой цены) остальное не чекать/сохранять в переменную price
как вы себе представляете возможность не проверяя все числа (цены) - понять, что эта самая низкая?
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
про кавычки вы правильно подметили, просто в этом коде, такой ошибки нету даже без кавычек
var macro; macro = "CODE:"; var node = window.document.querySelector('tr[data-href]'); var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode){ window.console.log(price.match(/[0-9.]+/)[0]); }
Отсутствует
про кавычки вы правильно подметили, просто в этом коде, такой ошибки нету даже без кавычек
значит парсер не добрался до этой строки из-за несовпадения условий ранее
дело в том что самое первое занесенное число оно всегда самое низкое, потому что сортировка стоит на сайте от большего к меньшему)
и в чем проблема тогда извлечь цену из
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
я с js как и с программированием в общем знаком 2 дня
если честно я не совсем понимаю что вы написали, а также не совсем понимаю куда это вставлять)
Отредактировано gødmøde (16-09-2019 01:08:01)
Отсутствует
исходя из вашего кода думаю что тут правильнее было бы написать name!=m_name
ну дело в том что мне не просто нужно получить самую верхнюю цену, а чтобы эта цена соответствовала моим критериям
ну так вы ее получаете судя по коду:
if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode){ window.console.log(price.match(/[0-9.]+/)[0]); }
Добавлено 16-09-2019 01:23:12
если я правильно понимаю то при срабатывании всех условий в:
Отредактировано InfSub (16-09-2019 01:23:12)
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
консолью я пользуюсь)
и с таким кодом
var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var m_name = "godmode"; var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name)//проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]); }
Отредактировано gødmøde (16-09-2019 01:28:43)
Отсутствует
я получаю вот такой вот список цен в консоль
на сколько я понимаю, вам нужно остановить цикл сразу после 1й цены равной в данном случае 10.00
если я прав, то смотрите конец моего предыдущего поста, после "Добавлено Сегодня 01:23:12"
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
написал break; как вы сказали, теперь консоль пустая совсем
var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var m_name = "godmode"; var price = node.querySelector('.text-right>div').textContent; if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name)//проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]); break; }
Отредактировано gødmøde (16-09-2019 01:48:13)
Отсутствует
gødmøde
фигурные скобки пропущены у вас, для одной команды после if не критично, но для двух и более ...
if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){//проверяю чтобы все совпадало window.console.log(price.match(/[0-9.]+/)[0]); break; };
Отредактировано InfSub (16-09-2019 01:54:07)
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует
ну дело в том что мне не просто нужно получить самую верхнюю цену, а чтобы эта цена соответствовала моим критериям
1 data-server=9792
2 data-side=52
3 data-online=1
Вы плохо ознакомились с предложенными мануалами.
Пишете селекторы атрибутов без пробелов, чтобы получить только ноды соответствующие значениям data-server="9792", data-side="52" и data-online="1"
Собираете в массив все цены из полученных нод и находите минималную цену
var nodes = window.document.querySelectorAll('[data-server="9792"][data-side="52"][data-online="1"]'); var arr = []; for (i=0;i<nodes.length;i++) { var price = nodes[i].querySelector('.text-right>div').textContent; // Собираем в массив "arr" значения преобразованные к числу arr.push(+price.match(/[0-9.]+/)[0]); } // Отфильтровываем из массива "arr" минимальное число var min_price = Math.min.apply(Math, arr); // Смотрим в консоль window.console.log(arr); window.console.log(min_price);
Отсутствует
дело в том что "я" уже написал вот такой код
//чекаю свою цену var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var m_name = "godmode"; var m_price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]; if(data_server==3194&&data_side==52&&data_online==1&&name==m_name){//проверка сервак, сторона, онлайн, мой ник window.console.log(m_price); //alert(m_price); break;} } //чекаю чужую самую низкую цену var nodes = window.document.querySelectorAll('tr[data-href]'); for (i=0;i<nodes.length;i++) { var node = nodes[i]; var data_server = node.getAttribute('data-server'); var data_side = node.getAttribute('data-side'); var data_online = node.getAttribute('data-online'); var name = node.querySelector('a').textContent; var m_name = "godmode"; var price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]; if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){//проверяю чтобы все совпадало window.console.log(price); break;} } //проверяю, если цена другого продавца ниже или = моей цене if(price <= m_price){ alert(price); } //проверяю, если моя цена меньше чем другого продавца else if(m_price < price){ alert(m_price); }
var name = "godmode"; var nodes = window.document.querySelectorAll('[data-server="9792"][data-side="52"][data-online="1"][a!=name]');
Отредактировано gødmøde (17-09-2019 02:01:06)
Отсутствует
pricetax.match is not a function потому что pricetax у вас это уже число а не строка. Метод match() работает со строками а не числами
var pricetax = "8.496434";// Сейчас строка window.console.log(pricetax.match(/\d+\.\d{2}/)[0]); // Или преобразуем число в строку с помощью метода String() var pricetax = 8.496434;// Сейчас число window.console.log(String(pricetax).match(/\d+\.\d{2}/)[0]);
проверка имени продавца, или идентификация себя по этому имени
Одним циклом всё это сортируете по условию в объект, а потом сравниваете.
Отредактировано Squatter (17-09-2019 03:12:11)
Отсутствует
большое спасибо за предыдущую помощь, не могли бы вы мне еще объяснить как определить правильно форму?
я постоянно чтобы что-то написать на js ищу похожие образцы кода в "интернетах", если точного аналога нету, начинаю перебирать разные варианты из "похожего"
может есть какой браузер/плагин чтобы при наведении на элемент в коде он мне писал "Вася искомый тобой заветный value="102.2" относится к (условно) getElementsByName('offers[3230][52][price]');
мне кажется что мои способы решения моих задач, аналогичны с попыткой езды на велосипеде с квадратными колесами
<input class="form-control price" name="offers[3230][52][price]" value="102.25" autocomplete="off" type="text">
document.getElementsByName('offers[3230][52][price]').value = 25252; document.getElementsByClassName("offers[3199][54][price]")[0].value="43434";
Отредактировано gødmøde (17-09-2019 19:30:58)
Отсутствует
еще вот так пробовал, не непомогло
window.document.getElementsByClassName('input[name=offers[3199][54][price]]').value="TEXT";
Отсутствует
Не гадайте. Потратьте 30 минут на изучение селекторов
Отсутствует
опять здравствуйте) не могли бы вы мне объяснить как происходит такая магия:
var cop = (0.01);// 1 копейка var cop2 = (0.02); var verh = (m_price+cop2);// верхний упор (моя цена +2 коп) var pricetax = (price*tax); var pricelast = (pricetax-cop);//конечная цена -1 копейка window.console.log(+pricetax +"-1 копейка = " +pricelast); //проверил как работает отнимание 1 копейки window.console.log(+m_price +" + " +cop2 +" = " +verh); //проверяю как работает прибавление 2 копеек
Отсутствует
Выше ссылку давал о типе данных и преобразовании типов. Читайте до понимания.
Прежде чем осуществлять арифметические действия, убедитесь, что значения переменных приведены к правильному типу (number).
Вам уже объяснил аналогичную вашу ошибку
Отредактировано Squatter (18-09-2019 15:18:41)
Отсутствует
да это я понял, я уже исправил это вот так
var m_price = Number(node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]);
var m_price = (node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]); //идентифицирую свою цену по собственному нику if(data_server==3194&&data_side==52&&name==m_name) и доставал цену продавца var price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]; if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){
И есчо: сегодня я для себя открыл такую новинку как GET запрос, и очумел когда увидел скорость работы своего скрипта на нём, это быстрее раза в 4 точно.
И собственно хотел у вас поинтересоваться о таком:
мой скрипт парсит цену, как только она не сама "лучшая" он нажимает кнопку "продать" и там там вводит новую актуальную цену, так вот вопрос собственно в чем, можно ли миновать загрузку второй страницы(пусть даже методом гет? зачем она мне?там где формы для цен/количества) ведь мне никакая информация от нее не нужна, мне бы просто отправить свой запрос с новыми ценами "не отходя от кассы" с основной страницы это реально? или это я бред нашифровал себе?
Отредактировано gødmøde (19-09-2019 00:00:40)
Отсутствует
но понять почему с отниманием все в порядке не могу
вычитанием, ну хоть пишите-то по русски, отнимают деньги в темном переулке
символ "+" это не только сложение чисел, это также конкатенация строк, в случае если с одной стороны строка (а со страницы сайта вы получаете именно строку), а с другой число, при использовании "+" вы получите не сложение, а конкатенацию строк
чтобы этого избежать нужно явно указать, что это не строка, а число
Добавлено 19-09-2019 02:30:22
не бы просто отправить свой запрос с новыми ценами
отправьте, если на стороне сайта нет каких-то ограничений или доп проверок, то скорее всего работать будет, но скорее всего будет не через GET а через POST
Отредактировано InfSub (19-09-2019 02:30:22)
Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox
на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!
Отсутствует