0
votes

I'm extracting some number from a row within safari.

here is a small sample of the script

set DATA39 to "0"
set DATA40 to "0"

to getInputByClass2(theClass, num) -- defines a function with two inputs, theClass and num
    tell application "Safari" --tells AS that we are going to use Safari
        set input to do JavaScript "
document.getElementsByClassName('" & theClass & "')[" & num & "].innerHTML;" in document 1 -- uses JavaScript to set the variable input to the information we want
    end tell
    return input --tells the function to return the value of the variable input
end getInputByClass2



getInputByClass2("sortable DATAId", 1)
set theText to Unicode text
set DATA1 to getInputByClass2("sortable DATAId", 1)
###################################################################
getInputByClass2("sortable DATAId", 2)
set theText to Unicode text
set DATA to getInputByClass2("sortable DATA", 2)
################################################################### 

I don't know how much data I'm collecting, so for now, I'm limiting the script to the first 30 results

(data1, data2 data3)

the only issue is when there is less than 30, I have the first result, then "missing value, missing value,missing value,"

I can't get rid of the missing value text?

I tried to set the variable before the script like

set DATA1 to missing value or set DATA1 to " " or even set DATA1 to "0"

but no luck, I know my script is probably make sense, I'm sure there is a better way to script this, like maybe using "repeat ?"

UPDATE: tell application "Safari" do JavaScript "var outPut=[]; var arr=document.getElementsByClassName('sortable DATAId');for (var i in arr) {outPut.push(arr[i].innerHTML)};outPut;" in document 1 --> {"

            <a href=\"/WebObjects/MYSupport.woa/wo/999AAHW44DhfffC5gg7Vh0/9.0.9.7.1.95.1.9.1.9.1.9.5.9.1.3.1\">DSID</a>

    ", "

            998877557

    ", "

            997777557

    ", "

            998877557

    ", "

            998877657

    ", missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value}

end tell tell application "Script Editor" display dialog {"

            <a href=\"/WebObjects/MYSupport.woa/wo/999AAHW44DhfffC5gg7Vh0/9.0.9.7.1.95.1.9.1.9.1.9.5.9.1.3.1\">DSID</a>

    ", "

            998877557

    ", "

            997777557

    ", "

            998877557

    ", "

            998877657

    ", missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value} buttons {"OK"} default button 1
    --> error number -1700 from {"


            <a href=\"/WebObjects/MYSupport.woa/wo/999AAHW44DhfffC5gg7Vh0/9.0.9.7.1.95.1.9.1.9.1.9.5.9.1.3.1\">DSID</a>

    ", "

            998877557

    ", "

            997777557

    ", "

            998877557

    ", "

            998877657

    ", missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value} to string

Result: error "Can’t make {\"

            <a href=\\\"/WebObjects/MYSupport.woa/wo/999AAHW44DhfffC5gg7Vh0/9.0.9.7.1.95.1.9.1.9.1.9.5.9.1.3.1\\\">DSID</a>

    \", \"

            998877557

    \", \"

            997777557

    \", \"

            998877557

    \", \"

            998877657

    \", missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value} into type string." number -1700 from {"


            <a href=\"/WebObjects/MYSupport.woa/wo/999AAHW44DhfffC5gg7Vh0/9.0.9.7.1.95.1.9.1.9.1.9.5.9.1.3.1\">DSID</a>

    ", "

            998877557

    ", "

            997777557

    ", "

            998877557

    ", "

            998877657

    ", missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value, missing value} to string
1

1 Answers

1
votes

Just put all elements into an array, use a javascript's loop to get the innerHtml of each element.

The output will be a list, use this list to get an item instead of having more than 30 variables.

set allData to my getInputByClass2("sortable DATAId")
-- to get the tenth value, use this --> item 10 of allData 

to getInputByClass2(theClass) -- this return a list of values
    tell application "Safari"
        set r to do JavaScript "var outPut=[]; var arr=document.getElementsByClassName('" & theClass & "');for (var i in arr) {outPut.push(arr[i].innerHTML)};outPut;" in document 1
    end tell
    return strings of r --- this remove all 'Missing Value' from a list of strings
end getInputByClass2

If you want to limit the length of the list, use this

set allData to my getInputByClass2(theClass, 30) -- 30 values maximum
-- to get the tenth value in the list, use this --> item 10 of allData 

to getInputByClass2(theClass, num) --this return a list of values
    tell application "Safari"
        set r to do JavaScript "var n=" & num & "; var outPut=[]; var arr=document.getElementsByClassName('" & theClass & "');var tLen=arr.length; if (n>tLen) {n=tLen;}; for (var i = 0; i < n; i++) {outPut.push(arr[i].innerHTML)}; outPut;" in document 1
    end tell
    return strings of r --- this remove all 'Missing Value' from a list of strings
end getInputByClass2

Update, the missing value are from the elements without innerHTML.

To get rid of missing value from a list of strings, use this syntax (set myList to strings of someList).

I updated the scripts.