Найти все цены от 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
         }
       }
     }
   }
 }

0 ответов

Другие вопросы по тегам