我使用Cheerio并请求Node.js做一些基本的网页抓取,但似乎无法弄清楚如何访问数据。页面通过请求加载,我可以使用Cheerio来控制页面标题。但是当我看到脚本时,它是一堆复杂的对象。
在页面的正文部分看起来像..
<body>
<script src="someUrl" script type="text/javascript" />
<script src="someUrl" script type="text/javascript" />
<script src="someUrl" script type="text/javascript" />
<script type="text/javascript">var months = [6,12,24,36,48,60]; var amounts = [5000,10000,15000,20000,25000]</script>
我试图找到最后一个脚本中的变量,将它们作为变量存储在我的节点脚本中供使用,但我似乎无法访问它们,即使是文本也是如此。
当我在节点中尝试这个时,我得到页面标题,然后是控制台中的一些巨大的对象响应,而不是要解析的变量文本。建议?
$ = cheerio.load(body);
console.log($('title').text());
var text = $('script');
console.dir(text[3]);
答案 0 :(得分:4)
您可以使用正则表达式解析这些变量,但是cheerio有点乱:
var cheerio = require('cheerio')
var html = `
<body>
<script src="someUrl" type="text/javascript" />
<script src="someUrl" type="text/javascript" />
<script src="someUrl" type="text/javascript" />
<script type="text/javascript">var months = [6,12,24,36,48,60]; var amounts = [5000,10000,15000,20000,25000]</script>
</body>
`
var str, $ = cheerio.load(html, {xmlMode: true}); // xmlMode: true is a workaround for many cheerio bugs.
console.log(str = $('script:not([src])')[0].children[0].data) // no cleaner way to do this, cheerio?
// var months = [6,12,24,36,48,60]; var amounts = [5000,10000,15000,20000,25000]
var months = JSON.parse(str.match(/months = (\[.*?\])/)[1])
console.log(months)
// [ 6, 12, 24, 36, 48, 60 ]
var amounts = JSON.parse(str.match(/amounts = (\[.*?\])/)[1])
console.log(amounts)
// [ 5000, 10000, 15000, 20000, 25000 ]