0

これがhtmlです...

<iframe width="100%" height="166" scrolling="no" frameborder="no" 
src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F11111111&amp;auto_play=false
&amp;show_artwork=true&amp;color=c3000d&amp;show_comments=false&amp;liking=false
&amp;download=false&amp;show_user=false&amp;show_playcount=false"></iframe>

NodeJSを使用しています。trackIDを抽出しようとしています。この場合は11111111次のようになりますtracks%2F。これを実行するための最も安定した方法は何ですか?

正規表現またはまたはなどのJS文字列メソッドを使用する必要がありますsubstring()match()

4

6 に答える 6

2

2019年の更新...

これは、blueiurの回答に基づいて構築され、ソリューションをより詳細に説明します。JSDOM使用する前にインストールする必要があります:

npm install jsdom

これで、ドキュメントによると、次のJSDOMようにインスタンス化できます。

const jsdom = require('jsdom');
const { JSDOM } = jsdom;

解析したいHTMLがすでにあるので、例を使用してテンプレートリテラルとして定義します。

const data = `<iframe width="100%" height="166" scrolling="no" frameborder="no" 
src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F11111111&amp;auto_play=false
&amp;show_artwork=true&amp;color=c3000d&amp;show_comments=false&amp;liking=false
&amp;download=false&amp;show_user=false&amp;show_playcount=false"></iframe>`;

ここに楽しい部分があります...NodeJSでhtmlを解析します:

const { document } = (new JSDOM(data)).window;

ここで何が起こっているのですか?提供されたHTMLを使用して新しいJSDOMオブジェクトを作成し、document属性の属性を取得していwindowます。この時点からdocument.getElementsByTagName()、ブラウザの場合と同じように、およびその他の同様の機能を使用できます。

特定の例を続けるために、ドキュメント内srcののみの属性を抽出する必要iframeがあります。これを行うには複数の方法があります。1つの例は、次のようgetElementsByTagNameに最初のプルを使用することです。iframe

const src1 = document.getElementsByTagName('iframe')[0].src;

src属性ができたので、それを分割してurlクエリ値を処理できます。URLここで、NodeJSに付属するクラスを使用します。ドキュメントによると、URLオブジェクトを作成し、次のsearchParamsように属性にアクセスすることで、検索パラメータを取得できます。

const params = (new URL(src1)).searchParams;

これで、クエリ文字列がURLSearchParamsオブジェクトとして取得され、次のように個々の用語にアクセスできます。

const scURL = params.get('src');

今の内容を見るとscURL、クエリとして渡された埋め込みURLであることがわかります。そのため、別のオブジェクトでそれを解析し、次のように属性URLを抽出できます。pathname

const src2 = (new URL(src2)).pathname;

近づいてきました。JavaScriptの標準の文字列関数を使用して、パスを目的のget値に分割できます。

const val = src2.split('/')[2];

そして結果を印刷します:

console.log(val);

...これはこの出力を生成します:

11111111

要約すると、完全なコードは次のとおりです。

const jsdom = require('jsdom');
const { JSDOM } = jsdom;

const data = `<iframe width="100%" height="166" scrolling="no" frameborder="no" 
src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F11111111&amp;auto_play=false
&amp;show_artwork=true&amp;color=c3000d&amp;show_comments=false&amp;liking=false
&amp;download=false&amp;show_user=false&amp;show_playcount=false"></iframe>`;

const { document } = (new JSDOM(data)).window;

const src1 = document.getElementsByTagName('iframe')[0].src;

const params = (new URL(src1)).searchParams;

const scURL = params.get('src');

const src2 = (new URL(src2)).pathname;

const val = src2.split('/')[2];

console.log(val);

それを自由に統合し、必要に応じて中間値を削除してください。

于 2019-11-04T16:58:48.740 に答える
1

ノードモジュール[url+jsdom+qs]でトラックを見つけることができます

これを試して

var jsdom = require('jsdom');
var url = require('url');
var qs = require('qs');

var str = '<iframe width="100%" height="166" scrolling="no" frameborder="no"'
  + 'src="http://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F11111111&amp;auto_play=false"'
  + '&amp;show_artwork=true&amp;color=c3000d&amp;show_comments=false&amp;liking=false'
  + '&amp;download=false&amp;show_user=false&amp;show_playcount=false"></iframe>';

jsdom.env({
  html: str,
  scripts: [
    'http://code.jquery.com/jquery-1.5.min.js'
  ],
  done: function(errors, window) {
    var $ = window.$;
    var src = $('iframe').attr('src');
    var aRes = qs.parse(decodeURIComponent(url.parse(src).query)).url.split('/');
    var track_id = aRes[aRes.length-1];

    console.log("track_id =", track_id);
  }
});

結果は次のとおりです。

track_id = 11111111

于 2012-07-11T15:44:05.697 に答える
1

tracks%2F一度だけ表示されることがわかっている場合は、次のようにします。

var your_track_ID = src.split(/tracks%2F/)[1].split(/&amp/)[0];

おそらくもっと良い方法がありますが、それはあなたの目的にはうまくいくはずです。

于 2012-07-10T03:39:23.820 に答える
1

正規表現を使用してHTMLを解析することは一般的にひどく悪い考えですが、これは許されるかもしれません。安全のために完全なURLを探します:

var pattern = /w\.soundcloud\.com.*tracks%2F(\d+)&/
  , trackID = (html.match(pattern) || [])[1]
于 2012-07-10T05:52:04.827 に答える
0

これを行うRight™の方法は、 XMLパーサーを使用してHTMLを解析し、その方法でURLを取得してから、reg-expを使用してURLを解析することです。

何らかの理由で時間とエネルギーが無限にない場合は、提案された純粋なreg-expソリューションの1つが機能します。

于 2012-07-11T21:42:12.637 に答える
0

トラックIDが常に8桁で、HTMLが変更されない場合は、次のように実行できます。

var trackId = html.match(/ \ d {8} /)

于 2012-07-10T05:00:58.903 に答える