如何正确使用getElementByXpath和getElementsByXpath?

时间:2015-12-12 11:11:04

标签: javascript html web-scraping casperjs

如何使用CasperJS获取表'td'值?

HTML源代码如下:

<table id="my_table">
  <tr id='header'>
    <th>sth_head_name</th>
    <th>ath_head_name</th>
    <th>sth_head_name</th>
    <th>sth_head_name</th>
    <th>sth_head_name</th>
  </tr>
  <tr>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
  </tr>
  <tr>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
  </tr>
  <tr>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
    <td>sth_value</td>
  </tr>
</table>

我想使用CasperJS获取表值。首先,我需要选择表格的行;然后我想获得'td'值。我该如何解决这个问题?

我尝试了很多方法,但那些都行不通。我的解决方案看起来像下面你看到的类似的东西。重要的是,首先选择'table_rows';然后在for循环中选择该td值。

var table_rows = casper.getElementsByXpath("//table[@id='my_table']/tr[not(@id='header')]");

for (var i = 0; i < table_rows.length; i++) {
  var firstRequiredCell_query = table_rows[j].getElementByXpath("//td[position()=2]");
  var secondRequiredCell_query = table_rows[j].getElementByXpath("//td[position()=4]");
  var firstRequiredCell = firstRequiredCell_query.text;
  var secondRequiredCell = secondRequiredCell_query.text;
}

1 个答案:

答案 0 :(得分:0)

CasperJS有两种情境。您只能直接从您在casper.evaluate() 1 内访问的页面上下文中访问DOM。它是沙箱,因此evaluate()中没有在外部定义的变量。

__utils__.getElementsByXpath()__utils__.getElementByXpath()仅在casper不可用的页面上下文中可用。这两个函数直接返回DOM节点,因此这些节点本身不具有getElementByXpath()函数。

但你根本不需要它:

casper.then(function(){
    var info = this.evaluate(function(){
        var table_rows = __utils__.getElementsByXpath("//table[@id='my_table']/tr[not(@id='header')]");

        return table_rows.map(function(tr){
            return {
                a: tr.children[1].textContent,
                b: tr.children[3].textContent
            };
        });
    });
    this.echo(JSON.stringify(info, undefined, 4));
});

您可以使用所有方式遍历DOM,例如childrenquerySelector()document.evaluate()

1 请同时阅读PhantomJS documentation of the same function