AppleScript: как извлечь числа из строки? - PullRequest
1 голос
/ 19 марта 2020

Я пишу сценарий для go на веб-сайте NYT на Corona, получаю данные США, извлекаю цифры (общее количество, смерть) и отправляю мне уведомление. Я близко, но когда я извлекаю числа и отображаю их, они соединяются (ie 700021 вместо 7000,21). Мой вопрос:

Как извлечь числа, чтобы они были разграничены?

Вот код:

set theURL to "https://www.nytimes.com/interactive/2020/world/coronavirus-maps.html?action=click&pgtype=Article&state=default&module=styln-coronavirus&variant=show&region=TOP_BANNER&context=storyline_menu"

tell application "Safari" to make new document with properties {URL:theURL}

tell application "System Events"
    repeat until exists (UI elements of groups of toolbar 1 of window 1 of application process "Safari" whose name = "Reload this page")
        delay 0.5
    end repeat
end tell

to getInputByClass(theClass, num)
    tell application "Safari"
        set input to do JavaScript "
document.getElementsByClassName('" & theClass & "')[" & num & "].innerText;" in document 1
    end tell
    return input
end getInputByClass

set myVar to getInputByClass("g-body ", 5)

on returnNumbersInString(inputString)
    set s to quoted form of inputString
    do shell script "sed s/[a-zA-Z\\']//g <<< " & s
    set dx to the result
    set numlist to {}
    repeat with i from 1 to count of words in dx
        set this_item to word i of dx
        try
            set this_item to this_item as number
            set the end of numlist to this_item
        end try
    end repeat
    return numlist
end returnNumbersInString

set theNums to returnNumbersInString(myVar) as text

display notification "COVID-19 UPDATE" subtitle theNums sound name "glass"

tell application "Safari"
    close its front window
end tell

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вы получаете список чисел из обработчика returnNumbersInString, но просто приведение списка к тексту обычно не обеспечивает какого-либо форматирования. Одним из решений будет использование text item delimiters для указания текста, который будет использоваться при объединении элементов списка. Например, при преобразовании в текст для уведомления вы можете сделать что-то вроде:

set tempTID to AppleScript's text item delimiters
set AppleScript's text item delimiters to ", "
set theNums to returnNumbersInString(myVar) as text
set AppleScript's text item delimiters to tempTID
0 голосов
/ 19 марта 2020

Как и в случае с другим вашим вопросом, с которым я вам помог, целевые данные уже находятся в таблице , и поэтому я буду использовать данные таблицы для получить информацию, так как структура ее структуры вряд ли изменится, где целью 'g-body ' из 5 не всегда могут быть Соединенные Штаты.

Я получаю свои данные немного по-другому:

set theURL to "https://www.nytimes.com/interactive/2020/world/coronavirus-maps.html?action=click&pgtype=Article&state=default&module=styln-coronavirus&variant=show&region=TOP_BANNER&context=storyline_menu"

tell application "Safari" to make new document with properties {URL:theURL}

tell application "System Events"
    repeat until exists ¬
        (UI elements of groups of toolbar 1 of window 1 of ¬
            application process "Safari" whose name = "Reload this page")
        delay 0.5
    end repeat
end tell

tell application "Safari" to tell document 1 to set CountriesTable to ¬
    do JavaScript "document.getElementsByClassName('svelte-f9sygj')[0].innerText;"

tell application "Safari" to close its front window

set awkCommand to ¬
    "awk '/United States/{print $3,\"Cases &\",$4,\"Deaths\"}'"

set notificationMessage to ¬
    do shell script awkCommand & "<<<" & CountriesTable's quoted form

display notification notificationMessage subtitle "US COVID-19 UPDATE" sound name "glass"


  • ПРИМЕЧАНИЕ: Код , используемый для определения, когда страница in Safari завершил загрузку в macOS Mojave и более поздних версиях, однако для macOS High Sierra и некоторых более ранних версий добавьте words buttons of перед UI elements ... в repeat until exists ¬ ... коде .

Примечание: пример AppleScript код только и не содержит обработки ошибок , которая может быть уместной. Пользователь должен добавить любую обработку ошибок , которая может быть уместной, необходимой или желаемой. Взгляните на оператор try и error оператор в Руководство по языку AppleScript . См. Также Работа с ошибками . Кроме того, может потребоваться использование delay command между событиями, где это необходимо, например, delay 0.5, со значением задержка установлена ​​соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...