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,在本例中11111111tracks%2F. 执行此操作的最稳定方法是什么?

我应该使用正则表达式还是一些 JS 字符串方法,例如substring()or 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中 only 的属性。iframe有多种方法可以做到这一点。一个例子是使用getElementsByTagName这样的拉第一个iframe

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

现在我们有了src属性,我们可以将其拆分并处理url查询值。这是我们将使用URLNodeJS 附带的类的地方。根据文档,我们可以通过创建 URL 对象并访问searchParams属性来获取搜索参数,如下所示:

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

现在您已经将查询字符串作为一个URLSearchParams对象,您可以像这样访问单个术语:

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

如果您查看scURLnow 的内容,您会发现它是作为查询传递的嵌入 url,因此我们可以用另一个URL对象解析它并提取如下pathname属性:

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

我们现在已经接近了,可以使用 JavaScript 的标准字符串函数将路径拆分为您想要的获取值:

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

如果你知道tracks%2F只会出现一次,你可以这样做:

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

可能有更好的方法,但这应该适合您的目的。

于 2012-07-10T03:39:23.820 回答
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

使用正则表达式解析 HTML 通常是一个非常糟糕的主意,但这可能是可以原谅的。为了安全起见,我会寻找完整的 URL:

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

The Right™ way to to do this is to parse the HTML using some XML parser and get the URL that way and then use a reg-exp to parse the URL.

If for some reasons you don't have an infinite amount of time and energy, one of the proposed purely reg-exp solutions would work.

于 2012-07-11T21:42:12.637 回答
0

如果曲目 ID 始终为 8 位并且 html 没有更改,您可以执行以下操作:

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

于 2012-07-10T05:00:58.903 回答