@ user3439894 - отличный ответ, и он показал вам несколько хороших и надежных методов определения загрузки веб-страницы; некоторый элементарный JavaScript; и сила awk
.
Я решил сделать это по-другому. Я использую JavaScript для выполнения всей тяжелой обработки, в основном потому, что моей конечной целью было получение списка record
объектов, каждый из которых представлял одно событие, указанное на веб-странице, из которого я извлек имя, местоположение и время каждого event.
tell application id "com.apple.Safari" to tell ¬
document 1 to set allEvents to do JavaScript ¬
"Array.from(document
.querySelectorAll('tbody#meetings_tbody '+
'tr '+
'td.name,'+
'td.time,'+
'td.location'))
.reduce((ξ,x,i,L) => {
ξ=Array.from(ξ);
i%3==1 && ξ.push({
'name': L[i].innerText,
'time': L[i-1].innerText,
'location': L[i+1].innerText
});
return ξ;
});"
Переменная allEvents
должна содержать что-то вроде этого:
{{|name|:"Saturday @ 7", |time|:"7:00 am", location:"Token 3 Club"},
{|name|:"Early Bird Meeting", |time|:"8:00 am", location:"Token 3 Club"},
{|name|:"Saturday Morning Meditation Group", |time|:"8:30 am", location:"Christ Church United Methodist"},
{|name|:"Saturday Morning Gratitude Group", |time|:"8:30 am", location:"Icehouse"},
...,
{|name|:"Agape", |time|:"10:30 pm", location:"Token 3 Club"}}
Я не уверен, насколько вы знакомы с AppleScript list
или record
объекты. Если вы внимательно изучите содержимое, вы увидите, что каждое событие представлено объектом, который выглядит следующим образом:
{|name|:"...", |time|:"...", location:"..."}
Это record
, который содержит три properties
: |name|
, |time|
и location
. Каждый property
имеет значение, которое вы получаете, ссылаясь на <property> of <record>
. Таким образом, если создать объект записи и назначить его переменной следующим образом:
set R to {a:1, b:"two", c:pi}
, то:
set myvar to b of R
извлечет значение свойства b
, принадлежащее записи R
и сохраните его в переменной myvar
. Таким образом, myvar
теперь оценивается как "two"
.
allEvents
- это не просто один record
объект; это много. Это list
из них. Вот пример списка:
set L to {1, "two", pi, 2^2, "5.0"}
Это не содержит свойства; он содержит только значения, и они называются items
. list
проводится в строгом порядке, а record
- нет. Следовательно, значение "two"
будет всегда появляться как второе item
в этом списке, но в записи оно может появляться в начале, в середине или в конце, но всегда будет присоединено к свойство b
. Чтобы извлечь элемент из списка:
set myvar to item 2 of L
Итак, несколько пропустив до конца, если вы хотите определить местоположение 4-го события в этом списке:
return the location of item 4 in allEvents --> "Icehouse"
все еще хотите последовать примеру @ user3439894 и реализовать тест, чтобы определить, когда страница загрузилась (если вы не собираетесь запускать скрипт вручную только после загрузки страницы самостоятельно). @ user3439894 также показал вам, как адаптировать код для браузера на основе Chromium (Google Chrome, Vivaldi, Brave).