1 votes

Comment extraire le contenu d'un champ texte spécifique dans une page web en utilisant AppleScript?

Comment puis-je utiliser Applescript et Safari pour extraire la réponse de ce site : http://www.wolframalpha.com/input/?i=whats+the+meaning+to+life%3F

Je tente d'extraire la réponse sous forme de texte copiable. C'est-à-dire au format .txt

Je reçois cette erreur :

"Impossible de faire des éléments de texte 2 à -1 de la valeur manquante en texte.

Lors de l'implémentation du script suivant :

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

to extractText(searchText, startText2, endText)
    set tid to AppleScript's text item delimiters
    set startText1 to "x"
    set searchText to ("x" & searchText)
    set AppleScript's text item delimiters to startText1
    set endItems to text item -1 of searchText
    set AppleScript's text item delimiters to endText
    set beginningToEnd to text item 1 of endItems
    set AppleScript's text item delimiters to startText2
    set finalText to (text items 2 thru -1 of beginningToEnd) as text
    set AppleScript's text item delimiters to tid
    return finalText
end extractText

getInputByClass("popup ui-draggable", 0)

set theText to getInputByClass("r", 0)

set theResult to extractText(theText, "", "")

3voto

markhunte Points 11634

Bien que la page que vous avez fournie renvoie une image des réponses, ce qui signifie que vous ne pouvez pas retourner de texte.

La source de la page contient la réponse sous forme de texte dans une fonction JavaScript.

Cet applescript utilise l'une de mes anciennes méthodes pour obtenir le texte entre les motifs.

Je le ferais probablement maintenant en utilisant ApplescriptOBJC mais j'ai pensé qu'il était préférable de le garder en Applescript avec une touche de shell. Car cela pourrait être plus compréhensible.

tell application "Safari" to set theString to (source of document 1)

(* Supprimer le texte et ne renvoyer que la dernière ligne*)
set input to do shell script "echo " & (quoted form of theString) & "|sed -n \"/stringified/,/mInput/p\" | sed '$!N;$!D'"

global answer

set offSet1 to "\"stringified\": \""
set offSet2 to "\",\"mInput\""

my strip(offSet1, offSet2, input)

return answer
on strip(offSet1, offSet2, thedata)
    (* Utiliser les décalages des motifs pour faire correspondre le texte # à travers # *)
    set textNumber1 to (offset of offSet1 in thedata)
    set theData1 to text -1 thru (textNumber1 + (count of offSet1)) of thedata
    set textNumber2 to (offset of offSet2 in theData1)
    set textString2 to text from word 1 to (textNumber2 - 1) of theData1
    set thedata to theData1
    set answer to textString2
end strip

Mise à jour.

L'auteur a souligné qu'il y a une option pour afficher une fenêtre contextuelle montrant la réponse en texte brut.

Cela n'est pas évident pour quiconque n'est pas familier avec le site. La fenêtre contextuelle n'existe pas dans la source de la page tant que vous n'avez pas cliqué sur cette option, c'est la raison pour laquelle je n'ai pas pu trouver les classes auxquelles l'auteur faisait référence dans la source de la page.

tapez ici la description de l'image

Le premier script ci-dessus ne nécessite pas que vous cliquiez sur une option ou obteniez la fenêtre contextuelle.

Mais si pour une raison quelconque vous le souhaitez, vous pouvez utiliser ce script qui nécessitera que la fenêtre contextuelle soit affichée au préalable :

tell application "Safari"
    set input to do JavaScript "theclass = document.getElementsByClassName('popup ui-draggable')[0]; theclass.getElementsByTagName('PRE')[0].innerHTML;" in document 1
end tell

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X