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&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
中 only 的属性。iframe
有多种方法可以做到这一点。一个例子是使用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
now 的内容,您会发现它是作为查询传递的嵌入 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&auto_play=false
&show_artwork=true&color=c3000d&show_comments=false&liking=false
&download=false&show_user=false&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);
随意巩固它并根据需要消除中间值。