通过 Apple 脚本从网页获取数据

Get data from webpage via Apple script

我正在尝试从网页中获取加密货币名称、价格和百分比的数据https://www.worldcoinindex.com/

如何通过以下脚本获取 % 列值?

set theHtml to do shell script "curl -s " & quoted form of "https://www.worldcoinindex.com"
set text item delimiters to {"<tbody>", "</tbody>"}
set tableContents to theHtml's text item 2 # item 2 is the body of the price table
set text item delimiters to {"<h2>"} # site uses new h2 for each currency
set tableChunks to tableContents's text items 2 thru -1
set pasteStr to ""
repeat with aChunk in tableChunks
    set text item delimiters to "><span>$ </span><span class=\"span\">"
    tell aChunk's text item 1 to set {theSymbol, thePrice} to {first word, last word}
    set pasteStr to pasteStr & theSymbol & tab & thePrice & return
end repeat
set the clipboard to pasteStr

这是供您考虑的替代方法:

请注意,这需要在 Develop 中的隐藏 Develop 菜单上选中 Allow JavaScript from Apple Events =]Safari.

要取消隐藏隐藏的 开发 菜单:

  • Safari > 首选项... > 高级 > [√]在菜单栏显示开发菜单

示例 AppleScript 代码:

tell application "Safari"
    
    make new document ¬
        with properties {URL:"https://www.worldcoinindex.com"}
    
    my waitForSafariPageToFinishLoading()
    
    tell front document
        
        set tickerList to {}
        set lastPriceList to {}
        set percentageList to {}
        
        repeat with i from 0 to 99
            set ticker to ¬
                do JavaScript ¬
                    "document.getElementsByClassName('ticker')[" & i & "].innerText;"
            copy words of ticker as text to end of tickerList
            set lastPrice to ¬
                do JavaScript ¬
                    "document.getElementsByClassName('number pricekoers lastprice')[" & i & "].innerText;"
            copy lastPrice to end of lastPriceList
            
            set percentage to ¬
                do JavaScript ¬
                    "document.getElementsByClassName('percentage')[" & i & "].innerText;"
            copy percentage to end of percentageList
        end repeat
        
    end tell
    
end tell

set tempListItem to {}
set groupedItemsList to {}
repeat with i from 1 to 100
    copy item i of tickerList to end of tempListItem
    copy item i of lastPriceList to end of tempListItem
    copy item i of percentageList to end of tempListItem
    copy tempListItem to end of groupedItemsList
    set tempListItem to {}
end repeat

set tabDelimitatedListAsText to ""
repeat with anItem in groupedItemsList
    set {TID, AppleScript's text item delimiters} to ¬
        {AppleScript's text item delimiters, tab}
    set thisItem to text of anItem as text
    set AppleScript's text item delimiters to TID
    set tabDelimitatedListAsText to ¬
        tabDelimitatedListAsText & thisItem & linefeed
end repeat

set the clipboard to tabDelimitatedListAsText


on waitForSafariPageToFinishLoading()
    --  # Wait for page to finish loading in Safari.
    --  # This works in macOS Catalina and 
    --  # macOS Big Sur and may need adjusting
    --  # for other versions of macOS.
    
    tell application "System Events" to repeat until ¬
        exists (buttons of groups of toolbar 1 of window 1 of ¬
            process "Safari" whose name = "Reload this page")
        delay 0.5
    end repeat
end waitForSafariPageToFinishLoading

注意:示例 AppleScript code 就是这样,没有包含任何 错误处理 不包含任何额外的 错误处理 可能是适当的。用户有责任根据需要或需要添加任何 错误处理 。查看 try statement and error statement in the AppleScript Language Guide. See also, Working with Errors. Additionally, the use of the delay 命令 在适当的事件之间可能是必要的,例如delay 0.5,适当设置延迟