使用 CasperJS 提取 table 个元素
extracting table elements with CasperJS
我想使用 CasperJS 将 table 中的连续(内部)HTML 字段提取到列表中。我知道从 table 中提取连续的 元素属性 很容易,但我不知道如何提取连续的 HTML 字段。
为了演示,这里有一个简单的 HTML table:
<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 程序,用于从 table:
中提取位
"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] 字段。但是我还没有想出一种直接的方法来从 table 中的给定列中提取内部 HTML。有什么指点吗?
旁白:我一直在做的是一次提取一个元素,用索引迭代,使用看起来像 table tr:nth-child(' + index + ') td:nth-child(2)
的 CSS,但感觉相当折磨。我希望找到更简单的东西。
这是一个解决方案,大量抄袭了 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));
});
另一种解决方案是获取 td 信息对象,然后从对象中获取文本:
//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();
我想使用 CasperJS 将 table 中的连续(内部)HTML 字段提取到列表中。我知道从 table 中提取连续的 元素属性 很容易,但我不知道如何提取连续的 HTML 字段。
为了演示,这里有一个简单的 HTML table:
<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 程序,用于从 table:
中提取位"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] 字段。但是我还没有想出一种直接的方法来从 table 中的给定列中提取内部 HTML。有什么指点吗?
旁白:我一直在做的是一次提取一个元素,用索引迭代,使用看起来像 table tr:nth-child(' + index + ') td:nth-child(2)
的 CSS,但感觉相当折磨。我希望找到更简单的东西。
这是一个解决方案,大量抄袭了 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));
});
另一种解决方案是获取 td 信息对象,然后从对象中获取文本:
//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();