AppleScript: сохранить слово только из списка - PullRequest
0 голосов
/ 01 апреля 2019

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

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

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

 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"}

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Хорошо, что вы, как правило, помните о предоставлении образца ввода, как вы сделали здесь со списком, который, как я предполагаю, относится к 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" просто будет приведен к классу 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, примененным к нужному элементу 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() - гораздо более мощный метод, который я упоминал ранееруда.

0 голосов
/ 01 апреля 2019

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

    set n to item x of PaymentMethods as text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...