使用CasperJS提取表元素

时间:2015-11-18 02:27:16

标签: javascript css-selectors casperjs

我想使用CasperJS将表中的连续(内部)HTML字段提取到列表中。我知道从表中提取连续的元素属性很容易,但我无法弄清楚如何提取连续的HTML字段。

为了演示,这是一个简单的HTML表格:

<html>
  <head></head>
  <body>
    <table>
      <tbody>
        <tr><td name="a">1</td><td>hop</td></tr>
        <tr><td name="b">2</td><td>skip</td></tr>
        <tr><td name="c">3</td><td>jump</td></tr>
      </tbody>
    </table>
  </body>
</html>

这是一个完整的casper程序,用于从表中提取位:

"use strict";
var casper = require('casper').create();

casper.start('file:///tmp/casper-so.html');

// I want to print the list '["a", "b", "c"]'
casper.then(function a1() {
    var names = casper.getElementsAttribute('table tr td[name]', 'name');
    // prints ["a", "b", "c"] as desired...
    console.log(JSON.stringify(names, null, 2));
});

// I want to print the list '["hop", "skip", "jump"]'
casper.then(function a2() {
    var verbs = ???;
    // What should go on the previous line in order to print 
    // ["hop", "skip", "jump"]?
    console.log(JSON.stringify(verbs, null, 2));
});

casper.run();

如代码中所述,我知道如何使用casper.getElementsAttribute()提取所有td [name]字段。但我还没有找到一种直接的方法来从表中的给定列中提取内部HTML。有什么指针吗?

除此之外:我一直在做的是一次一个地提取元素,使用索引进行迭代,使用看似table tr:nth-child(' + index + ') td:nth-child(2)的CSS,但感觉相当折磨。我希望能找到更简单的东西。

2 个答案:

答案 0 :(得分:5)

这是一个解决方案,大量来自casper对getElementsAttribute()的定义:

// print the list '["hop", "skip", "jump"]'
casper.then(function a2() {
    var verbs = casper.evaluate(function () {
        return [].map.call(__utils__.findAll('table tr td:nth-child(2)'), function (e) { return e.innerHTML; });
    });
    console.log(JSON.stringify(verbs, null, 2));
});

答案 1 :(得分:0)

另一个解决方案是获取td info对象,然后获取对象中的文本:

//get hop - 2nd td in DOM
var tdObject = this.getElementInfo('tr td:nth-of-type(2)');
tdTwoObjectText = tdObject.text.trim();

//get skip - 4th td in DOM
var tdObject = this.getElementInfo('tr td:nth-of-type(4)');
tdFourObjectText = tdObject.text.trim();

//get jump - 6th td in DOM
var tdObject = this.getElementInfo('tr td:nth-of-type(6)');
tdSixObjectText = tdObject.text.trim();