这是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&auto_play=false
&show_artwork=true&color=c3000d&show_comments=false&liking=false
&download=false&show_user=false&show_playcount=false"></iframe>
我正在使用NodeJS。我尝试提取trackID,在这种情况下11111111
跟tracks%2F
。执行此操作的最稳定方法是什么?
我应该使用正则表达式还是某些JS字符串方法,例如substring()
或match()
?
答案 0 :(得分:1)
如果你知道tracks%2F
只会在你能做到的时候出现:
var your_track_ID = src.split(/tracks%2F/)[1].split(/&/)[0];
可能有更好的方法,但这应该适合您的目的。
答案 1 :(得分:1)
使用正则表达式解析HTML通常是一个非常糟糕的主意,但这可能是可以原谅的。我会寻找安全的完整网址:
var pattern = /w\.soundcloud\.com.*tracks%2F(\d+)&/
, trackID = (html.match(pattern) || [])[1]
答案 2 :(得分: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&auto_play=false"'
+ '&show_artwork=true&color=c3000d&show_comments=false&liking=false'
+ '&download=false&show_user=false&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
答案 3 :(得分:0)
如果曲目ID始终为8位且html未更改,则可以执行以下操作:
var trackId = html.match(/ \ d {8} /)
答案 4 :(得分:0)
Right™的方法是使用一些XML parser解析HTML并以这种方式获取URL,然后使用reg-exp来解析URL。
如果由于某些原因你没有无限的时间和精力,那么提议的纯粹reg-exp解决方案就可以了。
答案 5 :(得分:0)
2019年更新...
这是基于blueiur的答案,并详细介绍了一个解决方案。 JSDOM
需要先安装,然后才能使用:
npm install jsdom
现在,根据documentation,您可以像这样实例化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&auto_play=false
&show_artwork=true&color=c3000d&show_comments=false&liking=false
&download=false&show_user=false&show_playcount=false"></iframe>`;
这是有趣的部分...在NodeJS中解析html:
const { document } = (new JSDOM(data)).window;
这是怎么回事?您正在使用提供的HTML创建新的JSDOM对象,并获取document
属性的window
属性。从现在开始,您可以像在浏览器中一样使用document.getElementsByTagName()
和其他类似功能。
要继续执行您的特定示例,您想提取文档中唯一src
的{{1}}属性。有多种方法可以做到这一点。一个示例是使用iframe
这样拉出第一个getElementsByTagName
:
iframe
现在我们有了const src1 = document.getElementsByTagName('iframe')[0].src;
属性,我们可以将其拆分并处理src
查询值。这是我们将使用NodeJS随附的url
类的地方。根据{{3}},我们可以通过创建URL对象并访问URL
属性来获取搜索参数,如下所示:
searchParams
现在,您已将查询字符串作为const params = (new URL(src1)).searchParams;
对象,并且可以访问像这样的单个术语:
URLSearchParams
如果现在查看const scURL = params.get('src');
的内容,您会发现它是作为查询传递的嵌入式URL,因此我们可以将其与另一个scURL
对象一起解析并提取{ {1}}属性如下:
URL
我们现在接近了,可以使用JavaScript的标准字符串函数将路径拆分为所需的get值:
pathname
并打印结果:
const src2 = (new URL(src2)).pathname;
...产生以下输出:
const val = src2.split('/')[2];
总结一下,这是完整的代码:
console.log(val);
可以随意合并,并根据需要消除中间值。