Extrahieren eines Abschnitts einer WebseiteLiebe Mitglieder der Community,
Ich versuche, einen Textabschnitt aus einer langen und unübersichtlichen Zeichenfolge zu extrahieren. Ich möchte den Beschreibungsteil eines YouTube-Videos extrahieren.
Zum Beispiel in diesem Video: https://youtu.be/yvoddqG-lm8 Ich möchte nur den Beschreibungsteil extrahieren:
„Mia Stephens zeigt, wie man grundlegende statistische Analysen in JMP durchführt. Sie behandelt die Verwendung der Verteilung, um Daten jeweils variabel zu analysieren. Verwenden Sie „Y nach X anpassen“ für Analysen mit zwei Variablen und „Modell anpassen“ für Analysen mit mehr als zwei Variablen. Sie prüft auch Tools zum Zusammenfassen und Darstellen von Daten. Dieses Video ist Teil drei einer Serie, in der Sie die Grundlagen der Verwendung von JMP erlernen, um Ihre 30-tägige kostenlose JMP-Testversion oder Ihre neue JMP-Lizenz optimal zu nutzen. Die akademische JMP-Botschafterin Mia Stephens zeigt, wie man durch die JMP-Menüs und Datentabellen navigiert, Daten in JMP importiert, Daten zusammenfasst und grafisch darstellt und grundlegende statistische Analysen durchführt. Diese Demo verwendet JMP 11, das im September verfügbar sein wird. Sehen Sie, was in JMP 11 kommt: http://www.jmp.com/software/preview-j...“
Mit dem folgenden Befehl schaffe ich es, das gesamte Webseitenskript als String abzurufen:
page = open (https://youtu.be/yvoddqG-lm8);
Mir ist aufgefallen, dass der Beschreibungsteil, den ich suche, einige Male auf der Seite erscheint. Insbesondere nach diesen Bedingungen:
\\!"description\\!":{\\!"runs\\!":[{\\!"text\\!":\\!"
Oder: \\!"description\\!":{\\!"simpleText\\!":\\!"
Irgendwelche Vorschläge ?
Bin ich auf dem richtigen Weg, den gesamten Seitencode zu extrahieren, oder gibt es eine Möglichkeit, nur den Abschnitt, den ich suche, direkt zu extrahieren?
Danke schön.
Betreff: Extrahieren eines Abschnitts einer Webseite – etwas fehlt@LNitz - YouTube-API könnte helfen. Die Informationen auf dieser Seite funktionieren möglicherweise nicht genau wie angezeigt, da sich der heruntergeladene YouTube-HTML-Code im letzten Jahr oder so offenbar geändert hat.
Ich denke, Sie möchten eine JMP-Datentabelle erstellen, die benötigten Spalten hinzufügen und entweder eine for-Schleife oder Spaltenformeln verwenden, um die Zeilen in der Tabelle zu füllen.
Betreff: Extrahieren eines Abschnitts einer WebseiteIch habe dieses nette Verfahren ausprobiert und es ohne Fehler ausgeführt.Ich weiß jedoch nicht, wie ich es einbetten soll, sodass der wiederhergestellte Text in einer JMP-Datei veröffentlicht wird.Wenn ich dies oder eine etwas andere Version ausführe, die auf eine andere Webseite verweist, empfängt die von mir definierte Datei (genannt Seite) keine Daten von der Webseite.
Hier ist mein Code (einschließlich der Originalquelldatei als Kommentar):
/*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 );
Betreff: Extrahieren eines Abschnitts einer WebseiteWenn es Ihnen nichts ausmacht, Ihrer Toolbox neue Tools hinzuzufügen (und Sie die Komplexität des Parsens von HTML mit regulären Ausdrücken vermeiden möchten), können Sie die Python Bridge von JMP nutzen (hier ist eine). Helfer, um es mit der Anaconda-Distribution zu verwenden ) und verwenden Sie ein Paket, das für die HTML-Analyse erstellt wurde, z Schöne Suppe.
Dieses Paket enthält jede Menge Dokumentation Und Beispiele da draußen, also sobald Sie herausgefunden haben, wie Sie die Daten zwischen JMP und Python übertragen (Details Hier ) können Sie sich auf das konzentrieren, was Sie extrahieren möchten, und dann darauf, was Sie damit in JMP tun möchten.
Betreff: Extrahieren eines Abschnitts einer WebseiteGroßartig!
Für alle, die mitlesen: Ganz oben, @Mark_Bailey stellte die vor widerwillig ? Operator:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
Ich habe es recycelt als .*? Aber es ist die gleiche Idee und ziemlich wichtig. Der ? folgende + oder * macht + oder * widerwillig anstatt gierig . + bedeutet ein oder mehr Und * bedeutet Null oder mehr von allem, was sich auf der linken Seite befindet ... in diesem Fall ein Punkt. Der Punkt passt zu allem. Gierig Bedeutet die * oder + Werde das wiederholen . (das mit jedem Zeichen übereinstimmt) bis zum Ende der Zeichenfolge, was etwa 50.000 Zeichen entspricht. Im obigen Beispiel muss Regex noch gefunden werden "> . Es kann am Ende des Textes nicht übereinstimmen, also beginnt Regex damit, die gierig erfassten Zeichen nacheinander freizugeben und zu testen "> .Höchstwahrscheinlich wird es gefunden "> das zu einer anderen in Anführungszeichen gesetzten Zeichenfolge am Ende der Zeichenfolge gehört und am Ende den gewünschten Text sowie eine Menge zusätzlichen Text akzeptiert.
Im widerwillig Ausführung, .*? Entspricht zunächst null Zeichen, findet die jedoch nicht "> . Der reguläre Ausdruck drückt also die .*? ein Zeichen weiterleiten und erneut testen. Widerwillig werde gleich das nächste finden "> , nicht einer am Ende des Textes.
Oft erhalten das gierige Verhalten und das widerstrebende Verhalten die gleiche Antwort, und Gier ist schneller. Aber in diesem Beispiel sind die Antworten anders und „Zögern“ ist schneller (weil es widerstrebend ein paar Dutzend Zeichen vorrücken lässt, während der Greedy-Fall möglicherweise Tausende von Zeichen vorwärts gehen und dann über die meisten von ihnen sichern muss).
Betreff: Extrahieren eines Abschnitts einer WebseiteDanke @Craige_Hales
Das schlägt ein wie ein Blitz! Extrahiert genau das, was ich wollte, und funktioniert auf verschiedenen YouTube-Seiten zuverlässig.
das ist meine finale Version
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( {"", "", ""} ) )
)Betreff: Extrahieren eines Abschnitts einer WebseiteSie versuchen, den Text aus einem Javascript-JSON-Snippet abzurufen. Ich denke, es wird einfacher sein, es weiter unten im HTML-Code zu finden. Ich benutze . anstelle von Anführungszeichen, nur um \ Escapezeichen zu vermeiden. Dieses
...
funktioniert, weil es in diesem keine verschachtelten gibt, die dazu führen würden, dass es vorzeitig beendet wird. Regex verarbeitet die verschachtelten Strukturen nicht selbst (der Mustervergleich kann dies jedoch).
Beachten Sie, dass die id= des Div den gewünschten Text identifiziert und daher für eine Weile recht robust sein könnte.
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);„Mia Stephens zeigt, wie man grundlegende statistische Analysen in JMP durchführt. Sie behandelt die Verwendung der Verteilung, um Daten jeweils variabel zu analysieren. Verwenden Sie „Y nach X anpassen“ für Analysen mit zwei Variablen und „Modell anpassen“ für Analysen mit mehr als zwei Variablen. Sie bespricht außerdem Tools zum Zusammenfassen und Darstellen von Daten. Dieses Video ist der dritte Teil einer Reihe, in der Sie die Grundlagen der Verwendung von JMP erlernen, um Ihre 30-tägige kostenlose JMP-Testversion oder Ihre neue JMP-Lizenz optimal zu nutzen. Die akademische JMP-Botschafterin Mia Stephens zeigt, wie man durch die JMP-Menüs und Datentabellen navigiert, Daten in JMP importiert, Daten zusammenfasst und grafisch darstellt und grundlegende statistische Analysen durchführt. Diese Demo verwendet JMP 11, das im September verfügbar sein wird. Sehen Sie, was in JMP 11 kommt: http://www.jmp.com/software/preview-j ...“
Betreff: Extrahieren eines Abschnitts einer WebseiteDanke @Mark_Bailey für deine Lösung. Es ist in dem Sinne robust, dass es aus jedem YouTube-Video, in dem ich es ausprobiert habe, eine saubere Zeichenfolge abruft. Es enthält jedoch eine gekürzte Version der Beschreibung (wie sich herausstellte, enthält der Code für jedes Video zweimal die vollständige Beschreibung und dreimal die kurze Beschreibung).
Beim Versuch, den Regex-Befehl zu ändern, bin ich mir nicht sicher, warum sie nicht so gut funktionieren wie Ihr Befehl. Merken Sie, was mit meinem Skript nicht stimmt?
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" );
Betreff: Extrahieren eines Abschnitts einer WebseiteDanke schön, @txnelson für die guten Wegbeschreibungen. Mit den grundlegendsten Zeichenfunktionen ist mir Folgendes gelungen:
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 );
Als ich zu diesem Zeitpunkt versuchte, dies auf andere YouTube-Seiten zu übertragen, stellte ich fest, dass das Präfix und das Suffix für die vollständige Beschreibung etwas inkonsistent sind, sodass ich verschiedene davon verwenden musste, um jeweils den richtigen Start- und Endpunkt zu finden.
Betreff: Extrahieren eines Abschnitts einer Webseitevon vor einiger Zeit: Twitter Screen Scraping und FFT-basiertes Cross Fade
Es verwendet einen wirklich einfachen regulären Ausdruck, um URLs für Bilder zu finden:
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
);
Es führt eine Schleife ohne Verwendung von PatRepeat mit PatFail() durch. PatFail stimmt nie überein und veranlasst den Matcher, es an der nächsten Position erneut zu versuchen. Jedes Mal findet es das https://.jpg Muster führt es etwas JSL aus, um die URL zu verarbeiten.
Ich habe es gerade ausprobiert, anscheinend ist Fußball immer noch ein brauchbarer Suchbegriff. Bei der ersten Abfrage erhalten Sie etwa 20 Bilder und danach etwa alle paar Minuten ein neues Bild.
Mark ist auf dem richtigen Weg und verwendet die HTML-Tags, um den gewünschten Inhalt zu identifizieren.
Betreff: Extrahieren eines Abschnitts einer WebseiteIch mag @txnelson Anregung. Sie können auch einen regulären Ausdruck für die Zeichenfolge verwenden. Du könntest stehlen, ähm, meine ich Studie der reguläre Ausdruck für HTML-Tags im Text-Explorer. Starten Sie es in einer beliebigen Spalte mit Zeichendaten. (Sie analysieren hier nicht wirklich Text.) Klicken Sie auf das rote Dreieck oben auf der Plattform und wählen Sie aus Parsing-Optionen > Regex anpassen . Es gibt mehrere Ausdrücke, die sich auf HTML beziehen. Klicken Sie auf die Schaltfläche „Hinzufügen“ (+) unter der Liste der Ausdrücke, um zur Bibliothek zu gelangen. Fügen Sie diejenigen hinzu, die vielversprechende Namen haben. Mit dem Editor können Sie die Ausdrücke prüfen und ändern. Mit dem Beispieltext oben oder den Beispielen in der Definition erhalten Sie sofort eine Rückmeldung.
Dies könnte so einfach sein wie:
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
Wie gesagt, mir gefällt der vorherige Vorschlag. Aber es ist gut, Optionen zu haben.
Betreff: Extrahieren eines Abschnitts einer WebseiteRon,
Ich habe ein paar Parser in der Reihenfolge geschrieben, die Sie anscheinend benötigen.Normalerweise verwende ich keine Open()-Funktion, aber ich verwende Loat Text File(), um die Datei in einen langen String einzulesen.Ich verwende dann „Contains()“, um zum Startpunkt zu gelangen, und „Substr()“ zur Zeichenfolge aller Zeichen nach dem von „Contains()“ zurückgegebenen Offset. Da Sie eine HTML-Datei einlesen, können Sie die Struktur der Markup-Sprache verwenden, um Ihre Startpunkte und Trennzeichen zu konfigurieren.
Viel Glück