Estrazione di una sezione di una pagina webCari membri della comunità,
Sto cercando di estrarre una sezione di testo da una stringa lunga e disordinata. Vorrei estrarre la parte descrittiva di un video di YouTube.
Ad esempio, in questo video: https://youtu.be/yvoddqG-lm8 vorrei estrarre solo la parte descrittiva:
“Mia Stephens mostra come eseguire analisi statistiche di base in JMP. Copre l'utilizzo della distribuzione per analizzare i dati una variabile alla volta. Utilizzo di Stima Y rispetto a X per analisi che coinvolgono due variabili e utilizzo Stima modello per analisi che coinvolgono più di due variabili. Esamina anche gli strumenti per riepilogare e rappresentare graficamente i dati. Questo video fa parte della terza parte ed è una serie sull'apprendimento delle nozioni di base sull'utilizzo di JMP per ottenere il massimo dalla prova gratuita di 30 giorni di JMP o dalla nuova licenza JMP. L'ambasciatrice accademica di JMP Mia Stephens dimostra come navigare nei menu e nelle tabelle di dati di JMP, importare dati in JMP, riepilogare e rappresentare graficamente i dati ed eseguire analisi statistiche di base. Questa demo utilizza JMP 11, che sarà disponibile a settembre. Scopri le novità in arrivo in JMP 11: http://www.jmp.com/software/preview-j...”
Riesco a ottenere l'intero script della pagina Web come stringa utilizzando il seguente comando:
page = open (https://youtu.be/yvoddqG-lm8);
Ho notato che la parte descrittiva che sto cercando appare alcune volte nella pagina. In particolare dopo questi termini:
\\!"descrizione\\!":{\\!"esegue\\!":[{\\!"testo\\!":\\!"
Oppure: \\!"descrizione\\!":{\\!"simpleText\\!":\\!"
Eventuali suggerimenti ?
Sono nella giusta direzione estraendo l'intero codice della pagina o c'è un modo per estrarre direttamente solo la sezione che sto cercando?
Grazie.
Ri: Estrazione di una sezione di una pagina web in cui manca qualcosa@LNitz - API di YouTube potrebbe aiutare. Le informazioni in questa pagina potrebbero non funzionare esattamente come mostrato perché il codice HTML di YouTube scaricato sembra essere cambiato nell'ultimo anno circa.
Penso che tu voglia creare una tabella di dati JMP, aggiungere le colonne che ti servono e utilizzare un ciclo for o formule di colonna per popolare le righe nella tabella.
Re: Estrazione di una sezione di una pagina webHo provato questa procedura accurata e l'ho eseguita senza errori.Ma non so come incorporarlo, in modo che il testo che recupero venga pubblicato in un file JMP.Mentre eseguo questo, o una versione leggermente diversa che punta a una pagina web diversa, il file che ho definito (chiamato Pagina) non riceve dati dalla pagina web.
Ecco il mio codice (incluso il file sorgente originale come commento):
/*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: Estrazione di una sezione di una pagina webSe non ti dispiace aggiungere nuovi strumenti alla tua casella degli strumenti (e vuoi evitare la complessità dell'analisi dell'HTML con le espressioni regolari), puoi sfruttare Python Bridge di JMP (ecco un helper per usarlo con la distribuzione di Anaconda ) e utilizzare un pacchetto creato per gestire l'analisi HTML, come Bella zuppa.
Questo pacchetto ne ha tonnellate documentazione E esempi là fuori, quindi una volta capito come trasferire i dati tra JMP e Python (dettagli Qui ) puoi concentrarti su ciò che desideri estrarre e poi su cosa farne in JMP.
Re: Estrazione di una sezione di una pagina webGrande!
Per chiunque stia leggendo: in alto, @Mark_Bailey ha introdotto il riluttante ? operatore:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
L'ho riciclato come .*? ma è la stessa idea ed è piuttosto importante. IL ? seguente + O * fa + O * riluttante invece di avido . + significa uno o più E * significa zero o più di qualunque cosa si trovi alla sua sinistra... in questo caso un punto. Il periodo corrisponde a qualsiasi cosa. Avido significa il * O + ripeterò il . (che corrisponde a qualsiasi carattere) fino alla fine della stringa, ovvero circa 50.000 caratteri. Nell'esempio sopra, la regex deve ancora trovare "> . Non può corrispondere alla fine del testo, quindi l'espressione regolare inizia a rilasciare i caratteri acquisiti avidamente, uno alla volta, testando per "> .Molto probabilmente troverà "> che appartiene a qualche altra stringa tra virgolette vicino alla fine della stringa e finisce per accettare il testo che desideri più un mucchio di testo extra.
Nel riluttante versione, .*? inizialmente corrisponde a zero caratteri, ma non trova il file "> . Quindi la regex spinge il .*? inoltra un carattere e verifica nuovamente. Riluttante troverà il prossimo "> , nemmeno uno verso la fine del testo.
Spesso il comportamento avido e il comportamento riluttante ottengono la stessa risposta, e l'avidità è più veloce. Ma in questo esempio le risposte sono diverse e riluttante è più veloce (perché avanzerà con riluttanza qualche dozzina di caratteri, mentre il caso più avido potrebbe dover avanzare di migliaia di caratteri e poi eseguire il backup della maggior parte di essi).
Re: Estrazione di una sezione di una pagina webGrazie @Craige_Hales
Questo colpisce come un fulmine! estraendo esattamente ciò che volevo ed è robusto su diverse pagine di YouTube.
questa è la mia versione finale
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: Estrazione di una sezione di una pagina webStai tentando di acquisire il testo da uno snippet json javascript. Penso che sarà più facile prenderlo dall'HTML più in basso. Sto usando . al posto delle virgolette solo per evitare \ escape. Questo
...
funziona perché non ci sono nidificati all'interno di questo che lo farebbero terminare anticipatamente. Regex non gestisce da solo le strutture nidificate (ma la corrispondenza dei modelli può farlo).
Nota che id= del div identifica il testo che desideri, quindi potrebbe essere abbastanza robusto, per un po'.
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);"Mia Stephens mostra come eseguire analisi statistiche di base in JMP. Copre l'utilizzo della distribuzione per analizzare i dati una variabile alla volta. Utilizzo di Stima Y rispetto a X per analisi che coinvolgono due variabili e utilizzo Stima modello per analisi che coinvolgono più di due variabili. Inoltre esamina gli strumenti per riepilogare e rappresentare graficamente i dati. Questo video fa parte della terza parte e consiste in una serie sull'apprendimento delle nozioni di base sull'utilizzo di JMP per ottenere il massimo dalla prova gratuita di 30 giorni di JMP o dalla nuova licenza JMP. L'ambasciatrice accademica di JMP Mia Stephens dimostra come navigare nei menu e nelle tabelle di dati di JMP, importare dati in JMP, riepilogare e rappresentare graficamente i dati ed eseguire analisi statistiche di base. Questa demo utilizza JMP 11, che sarà disponibile a settembre. Scopri le novità in arrivo in JMP 11: http://www.jmp.com/software/preview-j ..."
Re: Estrazione di una sezione di una pagina webGrazie @Mark_Bailey per la tua soluzione È robusto nel senso che recupera una stringa pulita da qualsiasi video di YouTube su cui l'ho provato. Tuttavia, fornisce una versione abbreviata della descrizione (a quanto pare, il codice di ciascun video include la descrizione completa due volte e la descrizione breve tre volte).
Tentando di modificare il comando regex, non sono sicuro del motivo per cui non funzionano bene come il tuo. Noti cosa c'è che non va nel mio script?
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: Estrazione di una sezione di una pagina webGrazie, @txnelson per le buone indicazioni. Utilizzando le funzioni di carattere più basilari sono riuscito a fare questo:
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 );
A questo punto, quando ho provato a duplicarlo su altre pagine di YouTube, ho scoperto che il prefisso e il suffisso per la descrizione completa sono in qualche modo incoerenti, quindi dovrei utilizzarne una varietà per trovare il punto iniziale e il punto finale corretti per ciascuno.
Re: Estrazione di una sezione di una pagina webdi qualche tempo fa: Twitter Screen Scraping e dissolvenza incrociata basata su FFT
sta usando una regex davvero semplice per individuare gli URL per le immagini:
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
);
Esegue il loop, senza utilizzare PatRepeat, con PatFail(). PatFail non corrisponde mai e fa sì che il matcher riprovi nella posizione successiva. Ogni volta che lo trova https://.jpg pattern esegue alcuni JSL per elaborare l'URL.
L'ho appena provato, a quanto pare il calcio è ancora un termine di ricerca praticabile. Riceverai circa 20 immagini alla prima query e successivamente una nuova immagine circa ogni pochi minuti.
Mark è sulla strada giusta, utilizza i tag HTML per identificare il contenuto che desideri.
Re: Estrazione di una sezione di una pagina webmi piace @txnelson suggerimento. Potresti anche usare un'espressione regolare nella stringa di caratteri. Potresti rubare, ehm, voglio dire studio la regex per i tag HTML in Esplora testo. Lanciatelo su qualsiasi colonna con dati di carattere. (Non stai realmente analizzando il testo qui.) Fai clic sul triangolo rosso nella parte superiore della piattaforma e seleziona Opzioni di analisi > Personalizza Regex . Esistono diverse espressioni legate all'HTML. Fare clic sul pulsante Aggiungi (+) sotto l'elenco delle espressioni per accedere alla libreria. Aggiungi quelli che hanno nomi promettenti. L'editor ti consentirà di esaminare e modificare le espressioni. Riceverai un feedback immediato con il testo di esempio in alto o gli esempi nella definizione.
Questo potrebbe essere semplice come:
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
Come ho detto, mi piace il suggerimento precedente. Ma è bene avere delle opzioni.
Re: Estrazione di una sezione di una pagina webRon,
Ho scritto un paio di parser nell'ordine in cui sembri aver bisogno.In genere non utilizzo una funzione Open(), ma utilizzo Loat Text File() per leggere il file in una lunga stringa.Quindi utilizzo Contiene() per arrivare al punto di partenza e a Substr() la stringa di tutti i caratteri dopo l'offset restituito da Contiene(). Poiché stai leggendo un file HTML, puoi utilizzare la struttura del suo linguaggio di markup per configurare i punti iniziali e i delimitatori.
Buona fortuna