1 votos

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

Tengo un applescript que devuelve el título de un sitio web, el único problema es que también contiene un montón de HTML no deseado (¿creo?). La mayoría de las veces, puedo superar esto mediante la eliminación de los caracteres comunes utilizando 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, como 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 -->

vuelve como "iPhone" en lugar de "iPhone 8"

editar: 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 solucionarlo?

3voto

qarma Puntos 71

Le aconsejo que revise (y, si lo desea, comente) el método que está utilizando para recuperar la información de la página web, ya que la mejor opción y la más fiable sería utilizar un método diferente para no tener que lidiar con el problema. ReactJS comentarios en absoluto.

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

No obstante, aquí tienes un método para eliminar las etiquetas de tus cadenas de texto, aunque no es ni mucho menos el único, ni necesariamente el más elegante o eficiente. Pero es razonablemente limpio y, suponiendo que las etiquetas sean todas simples ReactJS etiquetas de comentario, hará un trabajo fiable.

    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 incluyendo los saltos de línea que contenía (no estoy seguro de si estaban intencionadamente o eran un artefacto de cuando copió su script en el navegador); su presencia o ausencia no afecta a la eficacia de mi script, sino que simplemente necesitaba las dos líneas al principio del archivo stripTags que se deshace de ellos.

string2 es el texto que ha facilitado al final de su pregunta.

He mostrado la salida de cada uno de estos siguientes procesamientos. He conservado las comillas dobles llamadas "inteligentes" que forman parte de la cadena y se encuentran fuera de las etiquetas; he visto que habías optado por eliminarlas, pero su presencia aquí -sólo a efectos de demostración- es una buena garantía visual de que el script se dirige sólo a las etiquetas y conserva el texto entre ellas. Espero que no te importe si dejo esas comillas inteligentes para que las uses como quieras.

Si tiene alguna duda, póngase en contacto conmigo.

AÑADIDO 2018-05-12:

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

Por suerte, este problema parece bastante sencillo. Utilizando getElementsByClassName() es una buena idea, e incluso has conseguido identificar el nombre de la clase que te interesa, term-keyword__keyword . Bien hecho.

Los elementos asignados a ese nombre de clase son <p> elementos. En do tener un title pero está vacía, así que sospecho que no es lo que estás usando ni lo que buscas.

También tienen una propiedad llamada textContent que, como sugiere, devuelve el texto contenido en el 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 ReactJS tags.

Este código devuelve un array de los textContent propiedades de los tres cargados p.term-keyword__keyword etiquetas en el sitio en un momento dado: las dos visibles en ese momento y que se están comparando, y una fuera de la pantalla, a la derecha, a la espera de ser visualizada para la siguiente comparación.

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

También me he tomado la libertad de recortar las citas del principio y el final de los textos.

Incorpore esto a AppleScript de la siguiente manera

    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. Intentaba adivinar si "Microsoft Word" o "Moobs" tenían más búsquedas en Internet, y acerté; entonces apareció "Malasia", como ya sabía que ocurriría.

Utilizando este método, no es necesario despojar a cualquier ReactJS ni las comillas.

0 votos

En el sitio web "higherorlower.com" estoy usando javascript "document.getElementsByClassName" para devolver el título de la cantidad de búsqueda dada

0 votos

@cjeccjec Disculpa el retraso en responder, he estado indispuesto. El sitio web higherorlower.com devuelve un Error 403 (Prohibido). Le sigue funcionando; ¿necesito una autorización especial para acceder?

0 votos

Donde el nombre de la clase es "term-keyword__keyword" (0) usando el javascript todavía puedo obtener un título. El juego tiene que ser iniciado en clásico. Me he dado cuenta de que el sitio web actual es higherlowergame.com

1voto

boris42 Puntos 100

Esto puede resolverse fácilmente utilizando la función NSString en el Fundación 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”

0 votos

@CJK Por supuesto que devuelve "iPhone 8" como debe ser. Hice un copy/paste error tipográfico de la script Editor log...

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X