Найти все цены от Aliexpress
Я работаю над аддоном браузера, который пересчитывает цены от USD/EUR до CZK. В основном это работает, но не по каждой цене. Я разбираю исходный код, выбирая теги со словом "цена" в классе или itemprop, но не каждая цена помечается так. Просто я не могу установить универсальные правила, чтобы узнать, что такое цена, а что просто число.
Например, у них есть
<div class='some-price-tag'>US 99$</div> //this is not problem
<div class='some-price-tag'>US <span class='extra-price'>99$</span></div> //this is a bit tricky
<div class='extra-price-for-you'><span class='text-price-notification'>BEST</span><span itemprop='price-value'>23$</span></div> //it must be hell even for them
<b>56$</b>
и еще много неприятностей:)
Итак, мой вопрос: кто-нибудь знает, как установить некоторые правила, чтобы найти все цены или совершенно другой способ сделать это? Вот моя функция, как я ищу цены (это ужасно, я знаю):
(могут быть некоторые ошибки, потому что я быстро переименовал все переменные в английский для лучшего понимания, надеюсь, это поможет)
function findPrices(rate)
{
loop(document);
function loop(node)
{
var nodes=node.childNodes;
for (var i=0; i<nodes.length; i++)
{
if(!nodes[i])
{
continue;
}
if(nodes[i].childNodes.length>0)
{
loop(nodes[i]);
var nameTag=nodes[i].tagName;
var contentTag=nodes[i].innerText;
if (contentTag==undefined)
{
contentTag="";
}
var contantProp=nodes[i].getAttribute("itemprop");
if (contentProp==null)
{
contentProp="";
}
var testProp=obsahProp.indexOf("price");
var testClass=nodes[i].className.toString().indexOf("price");
var nextClass=nodes[i].className.toString().indexOf("notranslate");
var testOff=contentTag.toString().indexOf("%");
var testChild=nodes[i].children.length;
var testCalculated=nodes[i].getAttribute("data-calculated");
if (((nameTag=="B")||(nameTag=="P")||(nameTag=="DIV")||(nameTag=="DEL")||(nameTag=="SPAN"))&&((testClass!=-1)||(nextClass!=-1)||(testProp!=-1))&&(testOff==-1)&&(testChild==0)&&(testCalculated!="calculated"))
{
var testNumber=contantTag.match(/[0123456789.,\-]/g);
if (testNumber==null)
{
testNumber="";
}
if (testNumber.length>0)
{
nodes[i].setAttribute("title", "Original: "+contentTag);
nodes[i].setAttribute("data-calculated", "calculated");
nodes[i].innerHTML=escapeHTML(recalculate(contentTag,rate)); //this is price, so its sent to another function
}
}
var testCurrency=contentTag.match(/[$€£]/g);
var testNumbers=contentTag.match(/[0123456789]/g);
if (testCurrency==null)
{
testCurrency="";
}
if (testNumbers==null)
{
testNumbers="";
}
if ((testCurrency.length>0)&&(testNumbers.length>0))
{
nodes[i].setAttribute("title", "Original: "+contentTag);
nodes[i].setAttribute("data-calculated", "calculated");
nodes[i].innerHTML=escapeHTML(recalculate(contentTag,rate)); //this is price too, so its sent to another function
}
}
}
}
}