Webページのセクションを抽出するコミュニティのメンバーの皆様
長くて乱雑な文字列からテキストのセクションを抽出しようとしています。 YouTube動画の説明部分を抽出したいと考えています。
たとえば、このビデオでは次のようになります。 https://youtu.be/yvoddqG-lm8説明部分だけを抜粋したいと思います。
「Mia Stephens が、JMP で基本的な統計分析を実行する方法を示します。 彼女は、Distribution を使用して一度に 1 つの変数ずつデータを分析する方法について説明します。 2 つの変数を含む分析には Fit Y by X を使用し、3 つ以上の変数を含む分析には Fit Model を使用します。 また、データを要約してグラフ化するためのツールもレビューします。 このビデオのパート 3 は、JMP の 30 日間無料トライアルまたは新しい JMP ライセンスを最大限に活用するための JMP の使用の基本を学習するシリーズです。 JMP アカデミック アンバサダーの Mia Stephens が、JMP メニューとデータ テーブルの操作方法、JMP へのデータのインポート方法、データの集計とグラフ化、基本的な統計分析の実行方法を実演します。 このデモでは、9 月にリリースされる JMP 11 を使用します。 JMP 11 の新機能をご覧ください。 http://www.jmp.com/software/preview-j...”
次のコマンドを使用して、Web ページのスクリプト全体を文字列として取得できます。
page = open (https://youtu.be/yvoddqG-lm8);
私が探している説明部分がページ内に何度か表示されていることに気付きました。 特に次の用語の後:
\\!"説明\\!":{\\!"実行\\!":[{\\!"テキスト\\!":\\!"
または: \\!"説明\\!":{\\!"simpleText\\!":\\!"
助言がありますか ?
ページのコード全体を抽出する方向は正しいでしょうか、それとも探しているセクションだけを直接抽出する方法はありますか?
ありがとう。
Re: Web ページの一部を抽出する - 何かが欠けている@LNitz - YouTube API役立つかもしれません。 ダウンロードされる YouTube HTML がここ 1 年ほどで変更されたようであるため、このページの情報は表示どおりに機能しない可能性があります。
JMP データ テーブルを作成し、必要な列を追加し、for ループまたは列の式を使用してテーブル内の行を設定したいと考えています。
Re: ウェブページの一部を抽出するこのきちんとした手順を試してみましたが、エラーなしで実行できました。しかし、復元したテキストを JMP ファイルに投稿するための埋め込み方法がわかりません。これ、または別の Web ページを指すわずかに異なるバージョンを実行すると、定義したファイル (ページと呼ばれる) は Web ページからデータを受け取りません。
これが私のコードです(コメントとして元のソースファイルを含みます)。
/*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: ウェブページの一部を抽出するツールボックスに新しいツールを追加しても構わない (そして、正規表現を使用した HTML 解析の複雑さを避けたい) 場合は、JMP の Python ブリッジを利用できます (ここに、 Anaconda のディストリビューションで使用するためのヘルパー) など、HTML 解析を処理するために構築されたパッケージを使用します。美しいスープ。
このパッケージにはたくさんのものが含まれていますドキュメンテーションそして例JMP と Python の間でデータを転送する方法を理解したら (詳細ここ) 抽出したいものに集中して、それを JMP でどう処理するかに集中できます。
Re: ウェブページの一部を抽出する素晴らしい!
一緒に読んでいる人へ: ずっと上の方にいます、 @Mark_Baileyを紹介しました気が進まない?オペレーター:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
としてリサイクルしました.*?しかし、それは同じ考えであり、非常に重要です。 の?続く+または*作る+または*気が進まないの代わりによく深い。 + は意味1 つ以上のそして*手段ゼロ以上その左側にあるものは何でも...この場合はピリオドです。 ピリオドは何でも一致します。 よく深いを意味します*または+を繰り返します。 (任意の文字に一致する) 文字列の末尾まで (約 50,000 文字)。 上記の例では、正規表現はまだ検索する必要があります"> 。 テキストの末尾では一致しないため、正規表現は貪欲に取得した文字を一度に 1 つずつ解放し始め、次のことをテストします。 "> 。大抵は見つかるだろう">これは、文字列の終わり近くにある他の引用符で囲まれた文字列に属しており、必要なテキストに加えて追加のテキストを受け入れることになります。
の中に気が進まないバージョン、 .*?最初はゼロ文字と一致しますが、 "> 。 したがって、正規表現は.*? 1 文字進めて再度テストします。 気が進まないまさに次のものを見つけるだろう"> 、テキストの終わり近くにはありません。
多くの場合、貪欲な行動と消極的な行動では同じ答えが得られますが、貪欲な行動の方が早いのです。 しかし、この例では答えが異なり、消極的な方が速いです (消極的な場合は数十文字を消極的に進めるのに対し、貪欲な場合は数千文字を進めてからそのほとんどをバックアップする必要があるためです)。
Re: ウェブページの一部を抽出するありがとう@Craige_Hales
これは稲妻のように突き抜けます!私が望んでいたものを正確に抽出し、さまざまな YouTube ページにわたって堅牢です。
これが私の最終バージョンです
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: ウェブページの一部を抽出するJavaScript JSON スニペットからテキストを取得しようとしています。 HTML のさらに下から取得するのが簡単だと思います。 を使用しています。 \ エスケープを避けるためだけに引用符の代わりに使用します。 この
...
が機能するのは、この中には早期に終了するようなネストされた がないためです。 正規表現は、ネストされた構造をそれ自体で処理しません (ただし、パターン マッチングは処理できます)。
div の id= は必要なテキストを識別しているため、しばらくの間はかなり堅牢になる可能性があることに注意してください。
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);「Mia Stephens が、JMP で基本的な統計分析を実行する方法を示します。 彼女は、Distribution を使用して一度に 1 つの変数ずつデータを分析する方法について説明します。 2 つの変数を含む分析には Fit Y by X を使用し、3 つ以上の変数を含む分析には Fit Model を使用します。 また、データの要約とグラフ化のためのツールについてもレビューします。このビデオのパート 3 は、JMP の 30 日間無料トライアルまたは新しい JMP ライセンスを最大限に活用するための JMP の使用の基本を学習するシリーズです。 JMP アカデミック アンバサダーの Mia Stephens が、JMP メニューとデータ テーブルの操作方法、JMP へのデータのインポート方法、データの集計とグラフ化、基本的な統計分析の実行方法を実演します。 このデモでは、9 月にリリースされる JMP 11 を使用します。 JMP 11 の新機能をご覧ください。 http://www.jmp.com/software/preview-j ...」
Re: ウェブページの一部を抽出するありがとう@Mark_Baileyあなたの解決策のために。 私が試してみた YouTube ビデオからクリーンな文字列を取得するという意味では堅牢です。 ただし、説明の短縮バージョンが提供されます (実際、各ビデオのコードには完全な説明が 2 回、短い説明が 3 回含まれています)。
正規表現コマンドを修正しようとしましたが、なぜそれらがあなたのコマンドのようにうまく機能しないのかわかりません。 私のスクリプトのどこが間違っているのか気づいていますか?
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: ウェブページの一部を抽出するありがとう、 @txnelson良い方向へ。 最も基本的な文字関数を使用して、これを行うことができました。
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 );
この時点で、これを他の YouTube ページに複製しようとすると、完全な説明の接頭辞と接尾辞が多少矛盾していることがわかりました。そのため、それぞれの正しい開始点と終了点を見つけるには、さまざまな接頭辞と接尾辞を使用する必要があります。
Re: ウェブページの一部を抽出する少し前から: Twitter 画面スクレイピングと FFT ベースのクロスフェード
画像の URL を見つけるために非常に単純な正規表現を使用しています。
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
);
PatRepeat を使用せずに、PatFail() でループします。 PatFail は決して一致しないため、マッチャーは次の位置で再試行します。 それが見つかるたびに、 https://.jpgパターンでは、JSL を実行して URL を処理します。
試してみたところ、どうやらフットボールは依然として有効な検索語のようです。 最初のクエリでは約 20 枚の写真が取得され、その後は数分ごとに新しい写真が取得されます。
マークは、HTML タグを使用して必要なコンテンツを識別する正しい道を進んでいます。
Re: ウェブページの一部を抽出する好き@txnelson提案。 文字列に正規表現を使用することもできます。 あなたは盗むことができます、ええと、つまり勉強テキスト エクスプローラーの HTML タグの正規表現。 文字データを含む任意の列で起動します。 (ここでは実際にテキストを分析しているわけではありません。) プラットフォームの上部にある赤い三角形をクリックして、解析オプション > 正規表現のカスタマイズ。 HTML に関連する表現はいくつかあります。 式のリストの下にある [追加] ボタン (+) をクリックして、ライブラリに移動します。 有望な名前を持つものを追加します。 エディターを使用すると、式を調べて変更できます。 上部のサンプル テキストまたは定義内の例を使用して、すぐにフィードバックが得られます。
これは次のように単純かもしれません。
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
先ほども言いましたが、私は前の提案が気に入っています。 しかし、選択肢があるのは良いことです。
Re: ウェブページの一部を抽出するロン、
必要と思われる順序でいくつかのパーサーを作成しました。通常、Open() 関数は使用しませんが、Loat Text File() を使用してファイルを長い文字列に読み込みます。次に、Contains() を使用して開始点に到達し、Contains() から返されたオフセット以降のすべての文字の文字列を Substr() します。 HTML ファイルを読み取っているため、そのマークアップ言語の構造を使用して開始点と区切り文字を構成できます。
幸運を祈ります