如何使用cheerio(类似jquery的选择器,但没有dom)生成javascript变量的内容

how to result the contents of a javascript variable using cheerio (jquery like selectors, but no dom)

本文关键字:dom 生成 javascript 变量 cheerio 何使用 类似 jquery 选择器      更新时间:2024-03-10

有一个很大的html文件,里面有很多javascript标记。我正试图找出那个变量的内容。变量名称保持不变,但每次请求的内容都会发生变化。

example.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) 如何选择内容为"var foo"的数组对象b) 如何获取var foo变量的内容,以便将该信息导入到本地json变量中进行进一步处理。

当您在控制台中运行$('script')时,jquery会返回一个数组。

> $('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,但我在其他stackoverflow回复中读到(在研究这个问题时)它的性能较差,所以我更愿意学习我需要的正确jquery选择器来挖掘这个变量。

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 &

这当然是意料之中的,因为如果我使用xpath但不使用cheerio(jquery),.map(&:text)就是我要做的。

我搞定了!

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);
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' }

接受的答案在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
}