Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用NodeJS从HTML中提取字符串_Javascript_Regex_Node.js - Fatal编程技术网

Javascript 使用NodeJS从HTML中提取字符串

Javascript 使用NodeJS从HTML中提取字符串,javascript,regex,node.js,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;

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

如果您知道
曲目%2F
只会在您可以执行以下操作时出现:

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

可能有更好的方法,但对于您的目的来说,这应该很好。

如果您知道
曲目%2F
只会在您可以执行以下操作时出现:

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

可能有更好的方法,但对于您的目的来说,这应该可以很好地工作。

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


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

如果曲目id始终是8位数字,并且html没有更改,则可以执行以下操作:


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

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

var pattern = /w\.soundcloud\.com.*tracks%2F(\d+)&/
  , trackID = (html.match(pattern) || [])[1]

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

var pattern = /w\.soundcloud\.com.*tracks%2F(\d+)&/
  , trackID = (html.match(pattern) || [])[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);
  }
});
var jsdom=require('jsdom');
var url=require('url');
var qs=要求('qs');

var str='您可以使用节点模块[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);
  }
});
var jsdom=require('jsdom');
var url=require('url');
var qs=要求('qs');

var str='右侧™ 实现这一点的方法是使用some解析HTML,并以这种方式获取URL,然后使用regexp解析URL


如果由于某些原因,您没有无限的时间和精力,那么其中一个建议的纯reg exp解决方案将起作用。

正确答案™ 实现这一点的方法是使用some解析HTML,并以这种方式获取URL,然后使用regexp解析URL


如果由于某些原因,您没有无限的时间和精力,建议的纯reg exp解决方案之一将有效。

2019年更新…

这是基于blueiur的答案构建的,并详细介绍了解决方案
JSDOM
需要先安装,然后才能使用:

npm install jsdom
现在,根据,您可以像这样实例化
JSDOM

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
您已经有了一些要解析的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>`;
这里发生了什么事?您正在使用提供的HTML创建一个新的JSDOM对象,并获取
窗口
属性的
文档
属性。从现在开始,您可以像在浏览器中一样使用
document.getElementsByTagName()
和其他类似的函数

要继续您的特定示例,您需要提取文档中唯一
iframe
src
属性。有多种方法可以做到这一点。一个示例是使用
getElementsByTagName
拉取第一个
iframe
,如下所示:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
现在我们有了
src
属性,我们可以将其拆分并处理
url
查询值。这就是我们将使用NodeJS附带的
URL
类的地方。根据,我们可以通过创建URL对象并访问
searchParams
属性来获取搜索参数,如下所示:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
现在,您已经将查询字符串设置为
URLSearchParams
对象,您可以访问如下单个术语:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
如果您现在查看
scURL
的内容,您会发现它是作为查询传递的嵌入式url,因此我们可以使用另一个
url
对象解析它,并提取
pathname
属性,如下所示:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
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);
constjsdom=require('jsdom');
const{JSDOM}=JSDOM;
常量数据=``;
const{document}=(新JSDOM(数据)).window;
const src1=document.getElementsByTagName('iframe')[0].src;
常量参数=(新URL(src1)).searchParams;
const scURL=params.get('src');
const src2=(新URL(src2)).pathname;
const val=src2.split('/')[2];
控制台日志(val);

您可以根据需要合并该值并消除中间值。

2019年更新…

这是基于blueiur的答案构建的,并详细介绍了解决方案
JSDOM
需要先安装,然后才能使用:

npm install jsdom
现在,根据,您可以像这样实例化
JSDOM

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
您已经有了一些要解析的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>`;
这里发生了什么事?您正在使用提供的HTML创建一个新的JSDOM对象,并获取
窗口
属性的
文档
属性。从现在开始,您可以像在浏览器中一样使用
document.getElementsByTagName()
和其他类似的函数

要继续您的特定示例,您需要提取文档中唯一
iframe
src
属性。有多种方法可以做到这一点。一个示例是使用
getElementsByTagName
拉取第一个
iframe
,如下所示:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
现在我们有了
src
属性,我们可以将其拆分并处理
url
查询值。这就是我们将使用NodeJS附带的
URL
类的地方。根据,我们可以通过创建URL对象并访问
searchParams
属性来获取搜索参数,如下所示:

const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const src1 = document.getElementsByTagName('iframe')[0].src;
const params = (new URL(src1)).searchParams;
const scURL = params.get('src');
const src2 = (new URL(src2)).pathname;
现在,您已经将查询字符串设置为
URLSearchParams
对象,您可以