Safari上で一部のテキストを選択した「表」のデータをHTMLReaderフレームワークを利用してparseし、2D Listとして取得するAppleScriptです。
Web上の表データをそのまま利用したいケースが多々あります。こんな小さなデータではなく、数百個にわたる表データをインポートして使いたいというケースです。
そのときに作った部品を転用して、より一般的な用途に使えるようにしたのが本Scriptです。ただし、さまざまな用途に使って鍛えたというものでもなく、AppleのWebドキュメントやWikiの内容の抽出など、割と「規則性の高そうなコンテンツ」で利用してみました。
本来は、複数ページの特定の表を指定してデータを取得する用途に用いているものなので、本Scriptのように「選択中の文字列を含む表」といった、のどかな使い方はしません。動作内容がわかりやすいように作り変えたためにこのような仕様になっています。
どこぞのオンラインストアの諸元をまとめた表をWeb上からくすねてくる、とかいう用途だと、割と表が込み入って(JavaScriptを仕込んでソートし直せるようにしてあるとか)いるケースがあるので、どのページのどの表にでもあまねく利用できるという種類のものではありません。
–> Download HTMLReader.framework(To ~/Library/Frameworks)
HTMLReader.frameworkを利用するためには、macOS 10.14以降だとSIPを解除するかScript Debugger上で動かすか、AppleScriptアプレット内に組み込んで実行することになります。
AppleScript名:Safariで表示中のPageの選択中の文字を含む表データを取得.scptd |
— Created 2019-09-02 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "HTMLReader" –https://github.com/nolanw/HTMLReader property NSString : a reference to current application’s NSString property HTMLDocument : a reference to current application’s HTMLDocument property NSMutableArray : a reference to current application’s NSMutableArray tell application "Safari" set dList to every document –Sometimes "count every document"causes error if length of dList = 0 then return –Get URL tell front document set aURL to URL end tell –Get Selected Text set aRes to do JavaScript "var selObj = window.getSelection(); var selStr = (selObj).getRangeAt(0); unescape(selStr);" in front document if aRes = "" then return end tell set aRes to filterATableAndPaseCells(aURL, aRes) of me –> {{"Objective-C and AppleScript class", "Attributes (script term, if different)", "Relationships"}, {"NSObjectImplements the item AppleScript class. For any scriptable Objective-C class that inherits from NSObject, the AppleScript class it implements inherits from the item class (and inherits the class property and the properties property).", "class name (class), properties", ""}, {"NSApplicationImplements the application AppleScript class.", "name, active flag (frontMost), version", "documents, windows (both accessible as ordered relationship)"}, {"NSDocumentImplements the document AppleScript class.", "location of the document’s on-disk representation (path); last component of filename (name); edited flag (modified)", ""}, {"NSWindowImplements the window AppleScript class.", "title (name); various binary-state attributes: closeable, floating, miniaturized, modal, resizable, titled, visible, zoomable", "document"}} on filterATableAndPaseCells(aURL, aKeyword) set aData to (do shell script "curl " & aURL) set aHTML to current application’s HTMLDocument’s documentWithString:(aData as string) –Table要素をリストアップ set eList to (aHTML’s nodesMatchingSelector:"table") –Table要素のうちSafari上で選択中の文字列を含むものをサーチ(指定データを含むものを抽出) set hitF to false repeat with i in eList set cellList to i’s children()’s array() set htmlSource to i’s serializedFragment() as string –HTML source if htmlSource contains aKeyword then set hitF to true exit repeat end if end repeat if hitF = false then return false –Count columns of Table Header set aTableHeader to (i’s nodesMatchingSelector:"tr")’s firstObject() set hList to aTableHeader’s nodesMatchingSelector:"th" set hStrList to {} repeat with i1 in hList set the end of hStrList to i1’s textContent() as string end repeat set hLen to length of hStrList –count columns –Acquire whole table body contents set aTableBody to (i’s nodesMatchingSelector:"tbody")’s firstObject() set bList to aTableBody’s nodesMatchingSelector:"td" set bbList to {} repeat with i2 in bList set the end of bbList to i2’s textContent() as string end repeat set tbList to makeList1DTo2D(bbList, hLen) of me return {hStrList} & tbList end filterATableAndPaseCells –1D Listを2D化 on makeList1DTo2D(orig1DList, aMax) set tbList to {} set tmpList to {} set aCount to 1 repeat with i3 in orig1DList set j to contents of i3 set the end of tmpList to j if aCount ≥ aMax then set aCount to 1 set the end of tbList to tmpList set tmpList to {} else set aCount to aCount + 1 end if end repeat return tbList end makeList1DTo2D |
More from my site
(Visited 96 times, 1 visits today)
tableExtractor – AppleScriptの穴 says:
[…] 以前に作成した「Safariで表示中のPageの選択中の文字を含む表データを取得」Scriptがいい線を行っていた(あらかじめ表中のテキストを選択しておく、という前提条件がかったるいかと思 […]