AppleScript: сохранить только word из списка

#list #applescript

#Список #applescript

Вопрос:

Как я могу сохранить только слова / цифры из списка? Я использую скрипт follow и хочу подсчитать уникальные способы оплаты, но в моем списке есть нежелательные значения

Я также пытался использовать «слово элемента», но это не работает

Я пробую другую версию скрипта, но всегда возникает проблема

  set PaymentMethods to {}
    set UniquePaymentMethods to {}
    set walletPayement to {}
    set mobilePayemnt to {}

     tell application "Safari"
        set PaymentMethods to do JavaScript "var outPut=[]; var arr=document.getElementsByClassName('sortable Summary');for (var i in arr) {outPut.push(arr[i].innerHTML)};outPut;" in current tab of window 1
    end tell

   repeat with x from 1 to count of items of PaymentMethods
        set n to item x of PaymentMethods
        if n is in PaymentMethods and n is not in UniquePaymentMethods and n does not contain "<a href="/finance/Support.ok" and n does not contain "Safari" and n does not contain "None" then set end of UniquePaymentMethods to n
    end repeat
  

например, результат :

 {"

                                    PayPal

                            ", "

                                    MasterCard (999)

                            ", "

                                    MasterCard (888)

                            ", application "Safari"}
  

Ответ №1:

Хорошо, что вы обычно помните о предоставлении образца входных данных, как вы сделали здесь со списком, к которому, я полагаю, относится PaymentMethods . Но не забудьте также предоставить выходные данные, которые вы хотите получить обратно в конце. Мне потребовалось некоторое время, чтобы понять, что «сохранить слова / числа из списка» фактически относится к элементам класса text (или string ), что было примерно моей пятой интерпретацией того, что спрашивалось.

Кажется, что ваше решение делает то, что вы хотите, но на самом деле это не так, потому что вам пришлось использовать этот набор условий, зависящий от конкретного случая, т. Е.:

 if n is in PaymentMethods ¬
    and n is not in UniquePaymentMethods ¬
   and n does not contain ("<a href="/finance/Support.ok") ¬
   and n does not contain ("Safari") ¬
   and n does not contain "None" then ¬
       set end of UniquePaymentMethods to n
  

Без этого элемент application "Safari" , например, был бы просто принудительно преобразован в class text , который возвращался бы "Safari" в вашем результирующем списке.

Итак, хотя ваш запрос заключался в том, чтобы отфильтровать типы данных списка, чтобы они содержали только text элементы класса, предлагаемое вами исправление, т.Е.:

 set n to item x of PaymentMethods as text
  

не изолирует text элементы; он объединяет элементы любого класса в text .

Способ фильтрации списка по типу класса — использовать этот синтаксис:

 get every [class] in [list]
  

где [class] — класс AppleScript, который вы хотите сохранить (отбрасывая любые элементы, не относящиеся к этому классу), и [list] — список (или переменная, которая ссылается на список), например:

 every text in {1, "Hello", true, missing value, "2", text, number, pi}
    --> {"Hello", "2"}

every number in {1, "Hello", true, missing value, "2", text, number, pi}
    --> {1, 3.14159265359}

every application in {"PayPal", "MasterCard (999)", "MasterCard (888)", application "Safari"}
   --> {application "Safari"}

every text in {"PayPal", "MasterCard (999)", "MasterCard (888)", application "Safari"}
    --> {"PayPal", "MasterCard (999)", "MasterCard (888)"}
  

Но вы можете многое сделать для упрощения своего скрипта, заставив исходный код JavaScript выполнять тяжелую работу, чтобы он возвращал более чистый список элементов, который AppleScript будет проще обрабатывать или устранит любую необходимость в дополнительной обработке.

  1. В элементах вашего списка много пробелов. В JS используйте trim() .
  2. Ваши условные обозначения AppleScript ссылаются на свойство innerHTML, даже не желая использовать какой-либо фактический HTML. Вас постоянно интересовал только текст, который печатается на вашей веб-странице. Поэтому в JS поэкспериментируйте с innerText apply к нужному HTML-элементу, и вы, вероятно, сможете сразу выделить текст о способах оплаты.
  3. Похоже, вы хотите, чтобы ваш список содержал уникальные элементы. В JS используйте наборы, которые в основном представляют собой массивы с уникальными элементами.

Реализация этих трех рекомендаций вместе с описанным выше методом фильтрации по text классу будет выглядеть примерно так:

 tell application "Safari" to tell document 1 to tell (do JavaScript "
    [...new Set( document.getElementsByClassName('sortable Summary') )]
    .map( x => x.innerText.trim() );") ¬
    to set PaymentMethods to every text
  

Поскольку я не знаю, как выглядит исходный код вашей веб-страницы, возможно, вам потребуется внести небольшие коррективы в то, innerText кроме trim() того, как вы хотите преобразовать, и / или подумать, getElementsByClassName('sortable Summary') является ли это лучшим способом получить доступ к тем частям дерева HTML DOM, которые вам требуются. querySelectorAll() это гораздо более эффективный в использовании метод, о котором я упоминал ранее.

Комментарии:

1. Извините за задержку, я пропустил ваш ответ

Ответ №2:

Нашел его, нужно добавить вид для каждого элемента

     set n to item x of PaymentMethods as text