javascript - CasperJS querySelectorAll + map.call

标签 javascript casperjs selectors-api

html文件

<table id="tbl_proxy_list">
...........
 <tr>
   ......
    <td align="left">
        <time class="icon icon-check">1 min</time>
    </td>
    <td align="left">
        <div class="progress-bar" data-value="75" title="4625"></div>
    </td>
</tr>
</table>

ip.js文件

casper.start('http://www.proxynova.com/proxy-server-list/', function() {
    var info_text = this.evaluate(function() {
        var nodes = document.querySelectorAll('table[id="tbl_proxy_list"] tr');
        return [].map.call(nodes, function(node) { 
            //return node.innerText;
            return node;
        });
    });

    var tr_data = info_text.map(function(str) {
        var elements = str;
        var data = {
            ip        : elements,
            port      : elements[1],
            lastcheck : elements[2],
            speed     : elements[3], // <== value is 75..
        };
        return data;
    });

    utils.dump(tr_data);
});

casper.run();

return node.innerText 只是文本。

  • ip 是一个文本值
  • port 是一个文本值
  • lastcheck 是一个文本值
  • speed 不是文本值 (data-value="75")

我想导入data-value="75"(速度值为75)。

我不知道该怎么办

========================================

它的工作..很好。谢谢 Artjom。

但是 tr_data 回显错误。

首先,你的代码修改..

return {
    "ip":        tr.children[0].innerText.trim(),
    "port":      tr.children[1].innerText.trim(),
    "lastcheck": tr.children[2].innerText.trim(),
    "speed":     tr.children[3].children[0].getAttribute("data-value")
};

并回显..

//this.echo(tr_data.length);
for(var ii=0; ii<tr_data.length; ii++)
{
    this.echo(tr_data[ii]['ip']);
}

运行时报错..

TypeError: 'null' 不是一个对象(评估 'tr_data.length');有什么问题?

我需要你的帮助..谢谢。

最佳答案

您不能从页面上下文传递 DOM 元素(在 evaluate 回调中)。

来自docs :

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

返回一个 DOM 元素数组将导致一个包含许多 undefined 值的数组。这意味着您需要映射页面上下文中的所有内容,然后返回结果数组。您还只需要一个 map

var tr_data = this.evaluate(function() {
    var nodes = document.querySelectorAll('table[id="tbl_proxy_list"] tbody tr');
    return Array.prototype.map.call(nodes, function(tr, i) { 
        if (tr.children.length != 6) {
            return null; // skip ads
        }
        return {
            ip:        tr.children[0].innerText.trim(),
            port:      tr.children[1].innerText.trim(),
            lastcheck: tr.children[2].innerText.trim(),
            speed:     tr.children[3].children[0].getAttribute("data-value")
        };
    }).filter(function(data){
        return data !== null; // filter the null out
    });;
});

您可能还想 trim 多余的空白区域。

关于javascript - CasperJS querySelectorAll + map.call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124443/

相关文章:

javascript - document.querySelectorAll 具有伪类 :hover not working in FF or IE

javascript - 如何在 Nightwatch 中遍历 querySelectorAll 结果

javascript - 如何正确转义 css/js 属性选择器 [attr=value] 中的属性值?

css - 是否可以将某些 CSS 仅应用于禁用 Javascript 的用户?

javascript - 无法使用 CasperJS 在没有表单的情况下填充输入元素

javascript - 使用 Baobab 影响多个组件的状态

javascript - 如何使用 CasperJS 循环并查找所有 tr id

javascript - PhantomJS 网页内存消耗?

javascript - 如何过滤文档中的嵌入文档?

javascript - google maps api v3 中的 'googleBar' 在哪里