如何使用cheerio(类似jquery的选择器,但没有dom)生成javascript变量的内容
how to result the contents of a javascript variable using cheerio (jquery like selectors, but no dom)
有一个很大的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
}
相关文章:
- 向动态生成的DOM添加Angular自定义指令
- 使用车把仅为 JSON 中的特定键生成 DOM 内容
- 如何选择由 DevExpress constrols 使用 Javascript DOM 技术自动生成的 html “i
- 如何使用cheerio(类似jquery的选择器,但没有dom)生成javascript变量的内容
- 如何从angular.js生成的下拉列表中将值附加到DOM
- 使用D3.js从单个数据点生成多个DOM元素
- 自动生成唯一的DOM ID
- 在javascript生成的DOM元素上使用jQuery函数
- 如何让 CSS 影响解释 CSS 后生成的 DOM 元素
- 如何从 HTML 中选择 DOM 元素 由 rails 助手生成的 HTML image_tag
- 在JS操作DOM并传递请求标头后获取生成的HTML
- 通过 DOM 生成的 SVG 辐射未渲染
- DOM 中元素之间的“距离”(生成深度等)
- 使用 jQuery 生成 DOM 中已经存在的大块 HTML 的最简单和最好的方法
- 将搜索引擎索引DOM生成的HTML
- 用较少的代码用DOM生成文本
- 删除DOM生成的不带<img>内部
- 在锚点内单击DOM生成的元素时防止锚点行为
- 使用JavaScript DOM生成带有onClick函数的输入按钮
- 从DOM生成的表中删除一行