【问题标题】:Accessing script content with cheerio使用cheerio 访问脚本内容
【发布时间】:2018-05-02 15:30:48
【问题描述】:

我正在使用 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]);

【问题讨论】:

  • cheerio 解析 HTML 并创建一个您可以访问的迷你 DOM。它不会解析和运行页面中的 Javascript。为此,您需要通常称为无头浏览器的工具,例如 PhantomJS。

标签: node.js web web-scraping cheerio


【解决方案1】:

您可以使用正则表达式解析这些变量,但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 ]

【讨论】:

  • 这很棒。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多