如何使用 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
}