如何使用 cheerio 生成 javascript 变量的内容(jquery 类似于选择器,但没有 dom)
how to result the contents of a javascript variable using cheerio (jquery like selectors, but no dom)
有一个很大的 html 文件,里面有很多 javascript 标签。我试图挖出该变量的内容。变量名称保持不变,但内容会在每次请求时发生变化。
examplefile.html
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">var foo = {"b":"bar","c":"cat"}</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
期望的控制台结果
> var result = $('script').<some_selection_thingy>
result = {"b":"bar","c":"cat"}
让我解释一下...
我的意思是我的问题是 -
a) 我如何 select 具有内容 'var foo' 的数组对象
b) 如何获取 var foo 变量的内容,以便我可以将该信息导入本地 json 变量以进行进一步处理。
当您在控制台中 运行 $('script') 时,jquery returns 一个数组。
> $('script')
[<script type="text/javascript">//.... more js</script>,<script type="text/javascript">//.... more js</script>,<script type="text/javascript">var foo = {"b":"bar","c":"cat"}</script>,<script type="text/javascript">...</script>]
因为这实际上不是 cheerio jquery,dom 没有加载所以我不能只做 $(foo) .
有一个替代方案,我可以使用 jsdom 而不是 cheerio,但我在其他 Whosebug 响应中读到(在研究这个问题时)它的性能较低,所以我更愿意学习正确的 jquery select或者我需要挖出这个变量。
server.js
// some cheerio node code
url = 'someurl';
request(url, function(error, response, html){
var $ = cheerio.load(html);
result = $('script').map(&:text).select{ |s| s['var foo'] }
result = result[0]
//SyntaxError: Unexpected token &
这当然是意料之中的,因为 .map(&:text) 是我在使用 xpath 但不适用于 cheerio (jquery) 时会做的事情。
var cheerio = require('cheerio');
$ = cheerio.load(html);
然后您应该通过 $('script')[0].text()
获得您的文本。
如果您解析的始终是 "var foo = {"b":"bar","c":"cat"}" 模式,那么您可以执行类似的操作来获取对象:
var text = $('script')[0].text();
var str = text.substr(text.indexOf('{'), text.indexOf('}'));
JSON.parse(str);
{ b: 'bar', c: 'cat' }
我知道了!
function findTextAndReturnRemainder(target, variable){
var chopFront = target.substring(target.search(variable)+variable.length,target.length);
var result = chopFront.substring(0,chopFront.search(";"));
return result;
}
var text = $($('script')).text();
var findAndClean = findTextAndReturnRemainder(text,"var foo =");
var result = JSON.parse(findAndClean);
已接受的答案在 cheerio
中对我不起作用。这是我的解决方案:
var scripts = $('script').filter(function() {
return ($(this).html().indexOf('var foo =') > -1);
});
if (scripts.length === 1) {
var text = $(scripts[0]).html();
...parse the text
}
有一个很大的 html 文件,里面有很多 javascript 标签。我试图挖出该变量的内容。变量名称保持不变,但内容会在每次请求时发生变化。
examplefile.html
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">var foo = {"b":"bar","c":"cat"}</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
<script type="text/javascript">//.... more js</script>
期望的控制台结果
> var result = $('script').<some_selection_thingy>
result = {"b":"bar","c":"cat"}
让我解释一下... 我的意思是我的问题是 - a) 我如何 select 具有内容 'var foo' 的数组对象 b) 如何获取 var foo 变量的内容,以便我可以将该信息导入本地 json 变量以进行进一步处理。
当您在控制台中 运行 $('script') 时,jquery returns 一个数组。
> $('script')
[<script type="text/javascript">//.... more js</script>,<script type="text/javascript">//.... more js</script>,<script type="text/javascript">var foo = {"b":"bar","c":"cat"}</script>,<script type="text/javascript">...</script>]
因为这实际上不是 cheerio jquery,dom 没有加载所以我不能只做 $(foo) . 有一个替代方案,我可以使用 jsdom 而不是 cheerio,但我在其他 Whosebug 响应中读到(在研究这个问题时)它的性能较低,所以我更愿意学习正确的 jquery select或者我需要挖出这个变量。
server.js
// some cheerio node code
url = 'someurl';
request(url, function(error, response, html){
var $ = cheerio.load(html);
result = $('script').map(&:text).select{ |s| s['var foo'] }
result = result[0]
//SyntaxError: Unexpected token &
这当然是意料之中的,因为 .map(&:text) 是我在使用 xpath 但不适用于 cheerio (jquery) 时会做的事情。
var cheerio = require('cheerio');
$ = cheerio.load(html);
然后您应该通过 $('script')[0].text()
获得您的文本。
如果您解析的始终是 "var foo = {"b":"bar","c":"cat"}" 模式,那么您可以执行类似的操作来获取对象:
var text = $('script')[0].text();
var str = text.substr(text.indexOf('{'), text.indexOf('}'));
JSON.parse(str);
{ b: 'bar', c: 'cat' }
我知道了!
function findTextAndReturnRemainder(target, variable){
var chopFront = target.substring(target.search(variable)+variable.length,target.length);
var result = chopFront.substring(0,chopFront.search(";"));
return result;
}
var text = $($('script')).text();
var findAndClean = findTextAndReturnRemainder(text,"var foo =");
var result = JSON.parse(findAndClean);
已接受的答案在 cheerio
中对我不起作用。这是我的解决方案:
var scripts = $('script').filter(function() {
return ($(this).html().indexOf('var foo =') > -1);
});
if (scripts.length === 1) {
var text = $(scripts[0]).html();
...parse the text
}