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