【问题标题】:Cheerio not working. What am I doing wrong?Cheerio 不工作。我究竟做错了什么?
【发布时间】:2019-08-06 11:06:45
【问题描述】:

我正在尝试抓取分类广告搜索结果页面。

我已经尝试在控制台记录所有可以做的事情,以确保我得到响应,但当我实际使用cheerio 查询某些内容时,我没有得到任何回复。例如,如果我只是查询有多少孩子使用$('.listing-group').children('section').length,我在控制台记录它时会返回0 而不是24

这就是我正在做的事情。请原谅长网址。

const request = require("request");
const cheerio = require("cheerio");
const app = express();

app.get("/scrape", function(req, res) {
  url =
    "http://classifieds.ksl.com/search/?keyword=code&category%5B%5D=Books+and+Media&zip=&miles=25&priceFrom=&priceTo=&city=&state=&sort=";

  request(url, function(error, response, html) {
    if (!error) {
      let $ = cheerio.load(html);

      let test = $("#search-results").find("section").length

      console.log(test);

    } else {

      console.log("there has been an error");

    }

    res.send("Check the console.");

  });
});

app.listen("8081");
console.log("check localhost:8081/scrape");
exports = module.exports = app;

我是 Cheerio 的新手,所以我假设我可能犯了一个简单的错误,但是在我检查过的所有教程中,我似乎找不到答案。

最终我想抓取页面上的每个结果(在“部分”标签中找到)以显示我正在处理的个人项目的数据。

【问题讨论】:

  • 如果您在该页面上“查看源代码”,您会看到列表数据位于该页面中间的 json blob 中。所以你需要用正则表达式和 JSON.parse() 来提取它。
  • @pguardiario 感谢您的帮助。我四处挖掘,这就是我想出的。 let newStr = html.match(/\{\"id\"(.*)\"free\"\}/gm) 抓住了那个 blob,但是当我尝试用 let newstr = JSON.parse(html.match(/\{\"id\"(.*)\"free\"\}/gm)) 解析它时,我得到了一个错误。有什么进一步的指导吗?谢谢!

标签: javascript web-scraping cheerio


【解决方案1】:

看起来像:

JSON.parse(html.match(/listings: (\[.*\])/)[1])

【讨论】:

  • 太棒了。非常感谢。我对正则表达式很陌生,我不知道我在用它做什么。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2019-12-23
  • 2016-05-27
相关资源
最近更新 更多