Extraer una sección de una página webEstimados miembros de la comunidad,
Estoy intentando extraer una sección de texto de una cadena larga y desordenada. Me gustaría extraer la parte de descripción de un video de YouTube.
Por ejemplo, en este vídeo: https://youtu.be/yvoddqG-lm8 Me gustaría extraer sólo la parte de descripción:
“Mia Stephens muestra cómo realizar análisis estadísticos básicos en JMP. Ella cubre el uso de Distribución para analizar datos, una variable a la vez. Usar Fit Y by X para análisis que involucran dos variables y usar Fit Model para análisis que involucran más de dos variables. También revisa herramientas para resumir y representar gráficamente datos. Este video es la tercera parte de una serie sobre cómo aprender los conceptos básicos del uso de JMP para aprovechar al máximo su prueba gratuita de 30 días de JMP o su nueva licencia de JMP. La embajadora académica de JMP, Mia Stephens, demuestra cómo navegar por los menús y tablas de datos de JMP, importar datos a JMP, resumir y representar gráficamente datos y realizar análisis estadísticos básicos. Esta demostración utiliza JMP 11, que estará disponible en septiembre. Vea lo que viene en JMP 11: http://www.jmp.com/software/preview-j...”
Me las arreglo para obtener el script completo de la página web como una cadena usando el siguiente comando:
page = open (https://youtu.be/yvoddqG-lm8);
He notado que la parte de descripción que estoy buscando aparece varias veces en la página. En particular después de estos términos:
\\!"descripción\\!":{\\!"ejecuta\\!":[{\\!"texto\\!":\\!"
O: \\!"descripción\\!":{\\!"simpleText\\!":\\!"
Alguna sugerencia ?
¿Estoy en la dirección correcta al extraer el código completo de la página o hay alguna manera de extraer directamente solo la sección que estoy buscando?
Gracias.
Re: Extrayendo una sección de una página web, falta algo@LNitz - API de YouTube podría ayudar. Es posible que la información de esta página no funcione exactamente como se muestra porque el HTML de YouTube que se descarga parece haber cambiado durante el último año.
Creo que desea crear una tabla de datos JMP, agregar las columnas que necesita y usar un bucle for o fórmulas de columnas para completar las filas de la tabla.
Re: Extraer una sección de una página webProbé este sencillo procedimiento y lo ejecuté sin errores.Pero no sé cómo incrustarlo para que el texto que recupero se publique en un archivo JMP.Mientras ejecuto esto, o una versión ligeramente diferente que apunta a una página web diferente, el archivo que definí (llamado Página) no recibe datos de la página web.
Aquí está mi código (incluido el archivo fuente original como comentario):
/*page = open ("https://youtu.be/yvoddqG-lm8");;*/
page = Open( "https://www.theatlantic.com/ideas/archive/2021/07/republicans-anti-history-marjorie-taylor-greene/619403" );
division = Regex( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
Re: Extraer una sección de una página webSi no le importa agregar nuevas herramientas a su caja de herramientas (y desea evitar la complejidad de analizar HTML con expresiones regulares), puede aprovechar Python Bridge de JMP (aquí hay una ayudante para usarlo con la distribución de Anaconda ) y utilizar un paquete creado para manejar el análisis HTML, como Hermosa sopa.
Este paquete tiene toneladas de documentación y ejemplos por ahí, así que una vez que descubras cómo transferir los datos entre JMP y Python (detalles aquí ) puede concentrarse en lo que desea extraer y luego en qué hacer con ello en JMP.
Re: Extraer una sección de una página web¡Excelente!
Para cualquiera que siga leyendo: Muy arriba en la cima, @Mark_Bailey presentó el reacio ? operador:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
Lo reciclé como .*? pero es la misma idea y bastante importante. El ? siguiente + o * marcas + o * reacio en lugar de avaro . + significa uno o mas y * medio cero o más de lo que esté a su lado izquierdo... en este caso un punto. El punto coincide con cualquier cosa. Avaro significa el * o + repetirá el . (que coincida con cualquier carácter) hasta el final de la cadena, que tiene ~50.000 caracteres. En el ejemplo anterior, la expresión regular aún necesita encontrar "> . No puede coincidir al final del texto, por lo que regex comienza a liberar los caracteres adquiridos con avidez, uno a la vez, probando "> .Lo más probable es que encuentre "> que pertenece a alguna otra cadena entrecomillada cerca del final de la cadena y termina aceptando el texto que desea más un montón de texto adicional.
En el reacio versión, .*? inicialmente coincide con cero caracteres, pero no encuentra el "> . Entonces la expresión regular empuja el .*? reenvía un carácter y prueba nuevamente. Reacio encontrará el siguiente "> , ninguno cerca del final del texto.
A menudo, el comportamiento codicioso y el comportamiento renuente obtienen la misma respuesta, y el codicioso es más rápido. Pero en este ejemplo las respuestas son diferentes y reticente es más rápido (porque de mala gana avanzará unas pocas docenas de caracteres, mientras que en el caso codicioso podría tener que avanzar miles de caracteres y luego retroceder sobre la mayoría de ellos).
Re: Extraer una sección de una página webGracias @Craige_Hales
¡Esto atraviesa como un rayo! extrae exactamente lo que quería y es sólido en diferentes páginas de YouTube.
esta es mi versión final
New Table( "Video list",
Add Rows( 3 ),
New Script(
"bring description from YouTube",
For( i = 1, i <= N Rows(), i++,
page = Open( :link[i] );
division = Regex(
page,
"<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
:webpagetext[i] = withouttags;
)
),
New Column( "Video",
Character,
"Nominal",
Set Values(
{"Getting Started With JMP, Part 1", "Getting Started With JMP, Part 2",
"Getting Started With JMP, Part 3"}
)
),
New Column( "Link",
Character( 83 ),
"Nominal",
Set Values(
{
"https://www.youtube.com/watch?v=xge-f1KV_oc&list=PL411D719858B57C47&index=2&t=5s",
"https://www.youtube.com/watch?v=xhZVuDrKiEA&list=PL411D719858B57C47&index=3&t=0s",
"https://www.youtube.com/watch?v=1M8LzJ8bjwg&list=PL411D719858B57C47&index=4&t=0s"
}
)
),
New Column( "webpagetext", Character, "Nominal", Set Values( {"", "", ""} ) )
)Re: Extraer una sección de una página webEstá intentando obtener el texto de un fragmento json de JavaScript. Creo que será más fácil obtenerlo desde el HTML más abajo. Estoy usando . en lugar de comillas sólo para evitar \ escapar. Este
...
funciona porque no hay ningún anidado dentro de este que haga que finalice antes de tiempo. Regex no maneja las estructuras anidadas por sí sola (pero la coincidencia de patrones sí puede).
Tenga en cuenta que el id= del div identifica el texto que desea, por lo que podría ser bastante sólido por un tiempo.
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);"Mia Stephens muestra cómo realizar análisis estadísticos básicos en JMP. Ella cubre el uso de Distribución para analizar datos, una variable a la vez. Usar Fit Y by X para análisis que involucran dos variables y usar Fit Model para análisis que involucran más de dos variables. También revisa herramientas para resumir y representar gráficamente datos. Este video es la tercera parte de una serie sobre cómo aprender los conceptos básicos del uso de JMP para aprovechar al máximo su prueba gratuita de 30 días de JMP o su nueva licencia de JMP. La embajadora académica de JMP, Mia Stephens, demuestra cómo navegar por los menús y tablas de datos de JMP, importar datos a JMP, resumir y representar gráficamente datos y realizar análisis estadísticos básicos. Esta demostración utiliza JMP 11, que estará disponible en septiembre. Vea lo que viene en JMP 11: http://www.jmp.com/software/preview-j ..."
Re: Extraer una sección de una página webGracias @Mark_Bailey para su solución. Es robusto en el sentido de que recupera una cadena limpia de cualquier vídeo de YouTube en el que lo probé. Sin embargo, trae una versión más corta de la descripción (resulta que el código de cada vídeo incluye la descripción completa dos veces y la descripción corta tres veces).
Al intentar modificar el comando regex, no estoy seguro de por qué no funcionan tan bien como el suyo. ¿Te das cuenta de lo que está mal en mi guión?
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
// this works well for the short version of the description.
final = Regex ( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
// not working for the long version of the description.
final = Regex ( page, "description\\!":{\!"simpleText\!":\!"(.+?)\\!"},", "\1" );
Re: Extraer una sección de una página webGracias, @txnelson por las buenas direcciones. Usando las funciones de caracteres más básicas he logrado hacer esto:
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
startingpoint = Contains( page, "description\\!":{\\!"simpleText\\!":\\!"" );
rightremain = Substr( page, startingpoint + 32, Length( page ) );
endpoint = Contains( rightremain, "\\!"},\\!"lengthSeconds" );
final = Substr( rightremain, 0, endpoint - 1 );
Show( final );
En este punto, cuando intenté duplicar esto en otras páginas de YouTube, descubrí que el prefijo y el sufijo de la descripción completa son algo inconsistentes, por lo que tendría que usar una variedad de ellos para encontrar el punto inicial y final correcto para cada uno.
Re: Extraer una sección de una página webde hace un tiempo: Extracción de pantalla de Twitter y fundido cruzado basado en FFT
está utilizando una expresión regular realmente simple para localizar URL de imágenes:
x = Load Text File( "https://twitter.com/search?q=football&src=typd" );//cat%20OR%20dog%20OR%20turtle%20OR%20rabbit
Pat Match( x, // look for links to jpgs in the html
Pat Regex( "https://[^\!"']+?\.jpg" ) >> link + Pat Test(
// reject some links to small images and duplicates
If( !Contains( link, "bigger" ) & !Contains( link, "normal" ) & duplicate << Contains( link ) == 0,
duplicate[link] = 1; // remember this keeper
dt << addrows( 1 ); // make a row for it
dt:url = link;
dt << runformulas;// make sure it loads
);
1;
) + Pat Fail()// this forces the match to keep trying, recording all links
);
Se repite, sin usar PatRepeat, con PatFail(). PatFail nunca coincide y hace que el comparador vuelva a intentarlo en la siguiente posición. Cada vez que descubre que https://.jpg patrón, ejecuta algo de JSL para procesar la URL.
Lo acabo de probar, aparentemente fútbol sigue siendo un término de búsqueda viable. Obtendrá alrededor de 20 imágenes en la primera consulta, y una nueva imagen aproximadamente cada pocos minutos después de eso.
Mark está en el camino correcto, utilizando las etiquetas HTML para identificar el contenido que desea.
Re: Extraer una sección de una página webMe gusta @txnelson sugerencia. También puedes usar una expresión regular en la cadena de caracteres. Podrías robar, eh, quiero decir. estudiar la expresión regular para etiquetas HTML en el Explorador de texto. Ejecútelo en cualquier columna con datos de caracteres. (En realidad no estás analizando texto aquí). Haz clic en el triángulo rojo en la parte superior de la plataforma y selecciona Opciones de análisis > Personalizar expresiones regulares . Hay varias expresiones relacionadas con HTML. Haga clic en el botón Agregar (+) debajo de la lista de expresiones para ir a la biblioteca. Agregue los que tienen nombres prometedores. El editor te permitirá examinar y modificar las expresiones. Obtendrá comentarios inmediatos con el texto de muestra en la parte superior o los ejemplos en la definición.
Éste podría ser tan sencillo como:
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
Como dije, me gusta la sugerencia anterior. Pero es bueno tener opciones.
Re: Extraer una sección de una página webRon,
He escrito un par de analizadores en el orden de lo que parece necesitar.Normalmente no uso una función Open(), pero uso Loat Text File() para leer el archivo en una cadena larga.Luego uso Contiene() para llegar al punto de partida, y para Substr() la cadena de todos los caracteres después del desplazamiento devuelto por Contiene(). Dado que está leyendo un archivo HTML, puede utilizar la estructura de su lenguaje de marcado para configurar sus puntos de inicio y delimitadores.
Toda la suerte