¿Cómo eliminar texto no deseado de una cadena?

1

Tengo un applecript que devuelve el título de un sitio web, el único problema es que también contiene gran cantidad de HTML no deseado (¿creo?). La mayoría de las veces, puedo superar esto eliminando los caracteres comunes con el siguiente código.

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

Sin embargo, dado que este código elimina los números, cuando obtengo títulos como

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

regresa como "iPhone" en lugar de "iPhone 8"

edite: en el sitio web "higherorlower.com" Estoy usando javascript "document.getElementsByClassName" para devolver el título de la cantidad de búsqueda dada

¿Alguna idea para superar esto?

    
pregunta cjeccjec 26.04.2018 - 14:04

2 respuestas

3

Le aconsejaría que mire (y, si lo desea, sus comentarios) sobre el método que está utilizando para recuperar la información del sitio web, ya que la mejor opción y la más confiable sería utilizar un método diferente para que usted no tiene que lidiar con el ReactJS de los comentarios en absoluto.

Si hubiera incluido esa parte de su AppleScript junto con el resto, podría haber sido una oportunidad para resolver su problema desde su origen.

No obstante, aquí hay un método para eliminar las etiquetas de las cadenas de texto, aunque de ninguna manera es el único método, ni necesariamente el más elegante o eficiente. Pero está razonablemente limpio y, suponiendo que todas las etiquetas sean simples etiquetas de comentario ReactJS , hará un trabajo confiable.

    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 es una copia de su variable FirstTitle , incluidos los saltos de línea que contenía (no estoy seguro de si estos se encontraban en su intencionalidad o un elemento de cuando copió su script en el navegador); su presencia o ausencia no afecta la eficacia de mi script, sino que simplemente necesitó las dos líneas al comienzo del controlador stripTags que se deshace de ellas.

string2 es el texto que proporcionaste al final de tu pregunta.

He mostrado la salida de cada uno de estos procesos siguientes. Conservé las dobles citas "inteligentes" que forman parte de la cadena y se encuentran fuera de las etiquetas; Me di cuenta de que habías optado por eliminarlos, pero su presencia aquí, simplemente con fines de demostración, es una buena garantía visual de que el script se enfoca solo en las etiquetas y preserva el texto intermedio. Espero que no te importe si te dejo esas citas inteligentes para que las manejes como desees.

Avísame si tienes alguna consulta.

AGREGADO 2018-05-12:

@cjeccjec Gracias por actualizar la información del sitio web con la URL correcta. Consejo para la próxima vez: incluya el código que está usando para obtener el título. Será más fácil para las personas ayudarlo y también atraerá más ayuda.

Por suerte, este problema parece bastante sencillo. Usar getElementsByClassName() es una buena idea, e incluso logró identificar el nombre de clase de interés, term-keyword__keyword . Bien hecho.

Los elementos asignados a ese nombre de clase son <p> elementos. Ellos sí tienen una propiedad title , pero está vacía, así que sospecho que no es lo que estás usando ni lo que buscas en absoluto.

También tienen una propiedad llamada textContent , que, como sugiere, devuelve el texto contenido dentro del elemento, es decir, las etiquetas de los elementos que se comparan en este juego. Creo que eso es lo que buscas, y está completamente libre de etiquetas ReactJS .

Este código devuelve una matriz de las propiedades textContent de las tres etiquetas p.term-keyword__keyword cargadas en el sitio en cualquier momento: las dos actualmente visibles y en juego se están comparando; y una fuera de la pantalla a la derecha, esperando para desplazarse a la vista para la próxima comparación.

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

También me tomé la libertad de cortar las citas desde el principio y el final de los textos.

Incorpore esto en AppleScript de esta forma:

    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"

Esos fueron los resultados que obtuve mientras jugaba el juego. Estaba tratando de adivinar si "Microsoft Word" o "Moobs" tenían más búsquedas en Internet, que obtuve correctamente; luego "Malasia" se desplazó a la vista, como ya sabía. "

Al usar este método, no es necesario quitar ninguna etiqueta ReactJS , ni ninguna comilla.

    
respondido por el CJK 26.04.2018 - 16:39
1

Esto es bastante fácil de resolver mediante el uso de NSString en el marco de Foundation , que incluye soporte para expresiones regulares.

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

Salidas:

<!-- react-text: 477 -->“<!-- /react-text --><!-- react-text: 478 -->iPhone 8<!-- /react-text --><!-- react-text: 479 -->”<!-- /react-text -->
”iPhone 8”
    
respondido por el boris42 26.04.2018 - 16:31

Lea otras preguntas en las etiquetas