使用NodeJS从HTML中提取字符串

时间:2012-07-10 03:28:03

标签: javascript regex node.js

这是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()match()

6 个答案:

答案 0 :(得分:1)

如果你知道tracks%2F只会在你能做到的时候出现:

var your_track_ID = src.split(/tracks%2F/)[1].split(/&amp/)[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&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

答案 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&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的{​​{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);

可以随意合并,并根据需要消除中间值。