【问题标题】:Web scraping with node.js/cheerio - cannot get <span> text使用 node.js/cheerio 抓取网页 - 无法获取 <span> 文本
【发布时间】:2026-01-22 21:20:16
【问题描述】:

我需要制作一个简单的网络scraper来实时获取有关雅典证券交易所的一些基本信息。我选择的武器是 Node.js,更具体地说是“cheerio”模块。

我想要获取的信息在网站中表示为某些元素中的文本。这些元素嵌套在另一个元素中。一个例子是这样的:

<span id="tickerGeneralIndex" class="style3red">
  <span class="percentagedelta">
    -0,50%
  </span>
</span>

在这种情况下,我要提取的数据是“-0,50%”。

我写的代码是这样的:

var request = require('request'),
    cheerio = require('cheerio');

request('http://www.euro2day.gr/AseRealTime.aspx', function (error, response, html) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var span = $('span.percentagedelta').text();
        console.log(span);
    }
});

此代码不会产生所需的输出。运行时,它会在控制台中记录一个空行。

出于测试目的,我曾尝试像这样修改我的代码:

var request = require('request'),
    cheerio = require('cheerio');

request('http://www.euro2day.gr/AseRealTime.aspx', function (error, response, html) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var span = $('span.percentagedelta').attr('class');
        console.log(span);
    }
});

这样我可以在控制台中获得“percentagedelta”。这是正确的,因为我要求获取元素的类。当然这不是我想要的。我这样做只是为了确定是否正确加载了“跨度”变量。

我开始怀疑这与文本中的字符有关。是否有可能归咎于某些编码问题?如果是,我该如何解决?

【问题讨论】:

    标签: node.js web-scraping cheerio


    【解决方案1】:

    http://www.euro2day.gr/AseRealTime.aspx的原始html在'percentagedelta'中没有数据 你可以看看抛出你的 html 变量。

    页面上的javascript同步设置数据

    $("#tickerGeneralIndex .percentagedelta").html(data.percentageDelta);
    

    也许使用 ajax 获取页面加载的http://www.euro2day.gr/handlers/data.ashx?type=3 会更简单

    【讨论】:

    • @Rax.Wunter 看来你是对的。您能否详细说明您的第一个建议?如果没有,我将使用 JSON 选项。无论如何,提前谢谢!
    • 不可能得到你需要的数据,通过脚本请求网页,因为它不执行javascript。您可以努力使用 PhantomJs,例如,它可以在加载的页面上执行 javascript,但 JSON 选项要容易得多
    • 你是对的。我花了很多时间尝试学习 Cheerio,但无意学习 Phantom(据我所知,这并不容易)。所以……那就是 JSON。
    最近更新 更多