如何用纯JS刮取表格第n列的值?

时间:2014-07-22 22:18:40

标签: javascript web-scraping casperjs

我一直在网站上寻找这个答案,但所有答案似乎都是特定于jQuery的。

我使用Casper JS构建一个刮刀,我找不到合适的方法来选择列n的值,其中n是我指定的任意数字。

我特意以这种方式选择表格:

document.querySelector('table.table-responsive.table-noborder');

然后我回来了TableElement但是从那里开始,我不知道如何前进来获取特定列的内容,而不必迭代整个表(这就是我&# 39; m最终做的是获取数据)

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用document.getElementsByTagName('table')[m]访问相关的第m个索引表。

同样,你可以遍历表格,并通过innerHTML或nodeValue获取文本内容

document.getElementsByTagName('table')[2].getElementsByTagName('tr')[1].childNodes[0].innerHTML
document.getElementsByTagName('table')[2].getElementsByTagName('tr')[1].childNodes[0].nodeValue

答案 1 :(得分:1)

你可以编写自己的函数,可以很好地插入到casper中。这将迭代所有行中的第n个tdth,并将innerText属性的值写入结果数组中:

casper.tableColumnText = function(tableSelector, columnNumber, withHeader, merged){
    // columnNumber starts with 1
    var texts = this.evaluate(function(tableSelector, columnNumber, withHeader){
        var headerFields = document.querySelectorAll(tableSelector + " > thead > tr > th:nth-child("+columnNumber+")"),
            bodyFields = document.querySelectorAll(tableSelector + " > tbody > tr > td:nth-child("+columnNumber+")"),
            result = [];
        if (withHeader) {
            Array.prototype.forEach.call(headerFields, function(headerField){
                result.push(headerField.innerText);
            });
        }
        Array.prototype.forEach.call(bodyFields, function(bodyField){
            result.push(bodyField.innerText);
        });
        return result;
    }, tableSelector, columnNumber, withHeader);
    if (merged) {
        return texts.join(' ');
    }
    return texts;
};
浏览器(幻像)将注入

tbody,即使它没有出现在原始标记中。