如何使用cheerio(jquery like selectors,但没有dom)得到javascript变量的内容

Fal*_*son 3 javascript jquery jquery-selectors cheerio

有一个包含许多javascript标签的大型html文件.我正在尝试挖出该变量的内容.变量名保持不变,但每个请求的内容都会更改.

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>
Run Code Online (Sandbox Code Playgroud)

想要的控制台结果

> var result = $('script').<some_selection_thingy>
result = {"b":"bar","c":"cat"}
Run Code Online (Sandbox Code Playgroud)

让我解释一下......我的意思是我的问题是 - 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>]
Run Code Online (Sandbox Code Playgroud)

因为这是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 &
Run Code Online (Sandbox Code Playgroud)

这当然是预期的,因为.map(&:text)是我在使用xpath但不能使用cheerio(jquery)时所做的事情.

Fal*_*son 11

我知道了!

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);
Run Code Online (Sandbox Code Playgroud)


Jim*_*ung 5

var cheerio = require('cheerio');
$ = cheerio.load(html);
Run Code Online (Sandbox Code Playgroud)

那么你应该有你的文本$('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' }
Run Code Online (Sandbox Code Playgroud)