【问题标题】:CasperJS loop through table and scrape data for JSON outputCasperJS 循环遍历表并抓取 JSON 输出的数据
【发布时间】:2017-01-17 13:38:53
【问题描述】:

我实际上是在尝试从 CasperJs 中的网站获取一些数据。数据存储在表格中。 我正在尝试在报废后获取正确的 JSON 文件。一个json: - 公司的名称, - 邮件, - 网站 - 活动描述。

到目前为止,我已经能够打开页面并获取数据,但并不精确(邮件和网站在同一位置)。所以我找到了如何精确选择我想要的每个元素。 但在这种情况下,我没有得到所有表格信息,只有第一行......

我会知道是否有人可以帮助我,告诉我在哪里看或如何在我的情况下制作循环?假设我不是专业的开发人员,我正在训练自己。

这是我的代码:

var casper = require('casper').create();
var url = 'http://www.rent2016.fr/pages/exposants';
var fs = require('fs');
var length;

casper.start(url);

casper.then(function() {
    this.waitForSelector('table#myTable');
});

casper.then(function(){
    var info = this.evaluate(function(){
        var table_rows = document.querySelectorAll("tr"); //or better selector

        return Array.prototype.map.call(table_rows, function(tr){
            return {

                nom : document.querySelector(".td-width h3").textContent,
                description: document.querySelector(".td-width p").textContent,
                mail : document.querySelector("td span a").textContent,
                site : document.querySelector('td span a[href^="http"]').textContent,



            };
        });
    });

  fs.write('test_rent_stringify.json', JSON.stringify(info), 'w');
    this.echo(JSON.stringify(info, undefined, 4));

});


casper.run(function() {

});

在这里,我们没有循环:JSON 重复第一行信息。要获取您必须替换的每一行信息

nom : document.querySelector(".td-width h3").textContent,

 nom : tr.children[1].textContent,

但在这种情况下,您无法精确定位 H3,链接...您可以获得所有信息。所以实际上我可以:

  • 遍历行并获取信息,但它们无法使用

  • 只有第一行信息,但表现不错

提前致谢!

【问题讨论】:

  • 这篇文章可能对您有所帮助 -> stackoverflow.com/questions/41273739/… 您只需使用链接的解决方案将结果写入对象/数组/文件中即可。
  • 谢谢,但我已经查看了这篇文章。这是同样的问题:我不能精确地进入行内来选择我想要的数据。但更重要的是,这里我没有得到所有的数据,只有公司的名称和描述。它们在同一个 . 中

标签: javascript json web-scraping casperjs


【解决方案1】:

为了获取每个元素内部的信息,您必须使用 tr.querySelector 而不是 document.querySelector。

以下循环适用于页面:

var table_rows = document.querySelectorAll("tbody tr"); //or better selector
return Array.prototype.map.call(table_rows, function(tr) {
    return {
        nom: tr.querySelector(".td-width h3").textContent,
        description: tr.querySelector(".td-width p").textContent,
        mail: tr.querySelector('td span a[href^="mailto"]').textContent,
        site: tr.querySelector('td span a:not([href^="mailto"])').textContent
    };
});

【讨论】:

  • 非常感谢,很明显是代码,但也感谢我解释了我的错误方式!这解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多