#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 будет проще обрабатывать или устранит любую необходимость в дополнительной обработке.
- В элементах вашего списка много пробелов. В JS используйте
trim()
. - Ваши условные обозначения AppleScript ссылаются на свойство innerHTML, даже не желая использовать какой-либо фактический HTML. Вас постоянно интересовал только текст, который печатается на вашей веб-странице. Поэтому в JS поэкспериментируйте с
innerText
apply к нужному HTML-элементу, и вы, вероятно, сможете сразу выделить текст о способах оплаты. - Похоже, вы хотите, чтобы ваш список содержал уникальные элементы. В 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