Come rimuovere il testo indesiderato da una stringa?

1

Ho un applescript che restituisce il titolo da un sito Web, l'unico problema è che contiene anche molti HTML indesiderati (credo?). Il più delle volte, posso ovviare a ciò rimuovendo i caratteri comuni usando il seguente codice.

on CharacterRemover(inputString, ReplaceChar)

set TID to AppleScript's text item delimiters
set AppleScript's text item delimiters to ReplaceChar
set pieces to text items of inputString -- break string apart at commas
set AppleScript's text item delimiters to "" -- or whatever replaces the comma
set inputString to pieces as text -- put string back together using whatever
set AppleScript's text item delimiters to TID

return inputString

end CharacterRemover

set FirstTitle to "<!-- react-text: 45 -->“<!-- /react-text --><!-- 
react-text: 46 -->Megan Fox<!-- /react-text --><!-- react-text: 47 -- 
>”<!-- /react-text -->" --the format of the returned title
set FirstTitle to CharacterRemover(FirstTitle, "-")
set FirstTitle to CharacterRemover(FirstTitle, ">")
set FirstTitle to CharacterRemover(FirstTitle, "<")
set FirstTitle to CharacterRemover(FirstTitle, "!")
set FirstTitle to CharacterRemover(FirstTitle, "/")
set FirstTitle to CharacterRemover(FirstTitle, "reacttext")
set FirstTitle to CharacterRemover(FirstTitle, ":")
set FirstTitle to CharacterRemover(FirstTitle, "”")
set FirstTitle to CharacterRemover(FirstTitle, "“")

set z to 0

repeat 10 times
set FirstTitle to CharacterRemover(FirstTitle, z)
set z to z + 1
end repeat

set FirstTitle to CharacterRemover(FirstTitle, " ")

display dialog FirstTitle

Tuttavia, poiché questo codice rimuove i numeri, quando ottengo titoli come

<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->

restituisce come "iPhone" invece di "iPhone 8"

modifica: sul sito web "higherorlower.com" sto usando javascript "document.getElementsByClassName" per restituire il titolo dell'importo di ricerca specificato

qualche idea per superare questo?

    
posta cjeccjec 26.04.2018 - 14:04
fonte

2 risposte

3

Ti consiglierei di esaminare (e, se lo desideri, feedback su) il metodo che stai utilizzando per recuperare le informazioni dal sito web, in quanto l'opzione migliore e più affidabile sarebbe quella di utilizzare un metodo diverso in modo tale da non devi affatto occuparti dei commenti di ReactJS .

Se avessi incluso quella parte del tuo AppleScript insieme al resto, sarebbe stata una possibilità per risolvere il tuo problema all'origine.

Tuttavia, ecco un metodo per rimuovere i tag dalle stringhe di testo, sebbene non sia l'unico metodo, né necessariamente il più elegante o efficiente. Ma è ragionevolmente pulito e, presumendo che i tag siano tutti semplici tag di commento ReactJS , farà un lavoro affidabile.

    set string1 to "<!-- react-text: 45 -->“<!-- /react-text --><!-- \nreact-text: 46 -->Megan Fox<!-- /react-text --><!-- react-text: 47 -- \n>”<!-- /react-text -->"

    set string2 to "<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->"

    stripTags from string1 --> "“Megan Fox”"
    stripTags from string2 --> "“iPhone 8”"
    --------------------------------------------------------------------------------
    to stripTags from s as text
        local s

        # Eliminate linebreaks and join to form one line of text
        set the text item delimiters to {null, linefeed, return}
        set s to the text items of s as text

        # Use bash to isolate all the various tags within the string
        # Note: not suitable for tags with irregular content, such as
        # any that unexpectedly contain '<' or '>' as part of their
        # text content.  However, that shouldn''t be an issue here.
        do shell script "egrep -io -e '<[^>]+>' <<<" & the quoted form of s

        # Use the tags as a basis for elimination using AS's TIDs
        set the text item delimiters to {null} & paragraphs of the result
        set s to the text items of s as text

        return s
    end stripTags

string1 è una copia della tua variabile FirstTitle , comprese le interruzioni di riga che conteneva (non sono sicuro se queste fossero intenzionalmente o un artefatto di quando hai copiato il tuo script nel browser); la loro presenza o assenza non influisce sull'efficacia del mio script, ma richiede semplicemente le due linee all'inizio del gestore stripTags che le libera.

string2 è il testo che hai fornito in fondo alla tua domanda.

Ho mostrato l'output di ciascuna di queste seguenti elaborazioni. Ho mantenuto le doppie cosiddette quotazioni "intelligenti" che fanno parte della stringa e si trovano fuori dai tag; Ho visto che avevi scelto di eliminarli, ma la loro presenza qui - solo a scopo dimostrativo - è una bella rassicurazione visiva che lo script ha come target solo i tag e conserva il testo in mezzo. Spero non ti dispiaccia se lascio quelle citazioni intelligenti per te da affrontare come desideri.

Fammi sapere se hai domande.

AGGIUNTO 2018-05-12:

@cjeccjec Grazie per aver aggiornato le informazioni del sito Web con l'URL corretto. Suggerimento per la prossima volta: includi il codice che stai utilizzando per ottenere il titolo. Sarà più facile per le persone aiutarti e attirerà anche più aiuto.

Fortunatamente, questo problema sembra abbastanza semplice. L'utilizzo di getElementsByClassName() è una buona idea e sei persino riuscito a identificare il nome di classe di interesse, term-keyword__keyword . Ben fatto.

Gli elementi assegnati a quel nome classe sono <p> elementi. Loro fanno hanno una proprietà title , ma è vuota, quindi sospetto che non sia quello che stai usando, né quello che stai cercando.

Hanno anche una proprietà chiamata textContent , che, come suggerisce, restituisce il testo contenuto all'interno dell'elemento, cioè le etichette degli oggetti confrontati in questo gioco. Credo che questo è ciò che stai cercando, e è completamente privo di tag ReactJS .

Questo codice restituisce una matrice delle proprietà textContent dei tre tag p.term-keyword__keyword caricati sul sito in qualsiasi momento: i due attualmente visibili e in gioco confrontati; e uno fuori campo a destra in attesa di scorrere in vista per il prossimo confronto.

    Array.from(document
              .getElementsByClassName('term-keyword__keyword'),
               e=>e.textContent.slice(1,-1)
              );

Mi sono anche preso la libertà di tagliare le virgolette dall'inizio e dalla fine dei testi.

Incorporalo in AppleScript in questo modo:

    tell application "Safari" to set labels ¬
        to do JavaScript "Array.from(document" & ¬
        ".getElementsByClassName('term-keyword__keyword')," & ¬
        "e=>e.textContent.slice(1,-1));" in the front document

    --> {"Microsoft Word", "Moobs", "Malaysia"}

    item 2 of labels --> "Moobs"

Questi erano i risultati che mi sono stati restituiti durante il gioco. Stavo cercando di indovinare se "Microsoft Word" o "Moobs" avessero più ricerche su Internet, cosa che ho ottenuto correttamente; poi "Malesia" scorreva in vista come sapevo già che sarebbe.

Utilizzando questo metodo, non è necessario rimuovere alcun tag ReactJS di distanza, né virgolette.

    
risposta data 26.04.2018 - 16:39
fonte
1

Questo è abbastanza facilmente risolvibile usando NSString nel framework Foundation , che include il supporto per le espressioni regolari.

use framework "Foundation"
set sample1 to "<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->"
log sample1
log removeHTML(sample1)

on removeHTML(instr)
    set nStr to current application's NSString's stringWithString:instr
    return (nStr's stringByReplacingOccurrencesOfString:"<[^>]+>" withString:"" 
        options:(current application's NSRegularExpressionSearch) 
        range:{0, nStr's |length|()}) as text
end removeHTML

Uscite:

<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->
”iPhone 8”
    
risposta data 26.04.2018 - 16:31
fonte

Leggi altre domande sui tag