2

Casperjs を使用して Web サイトをスクレイピングしており、リストを含む特定の div を抽出しようとしています。私がスクレイピングしているページの簡略版は次のようになります。

<div id="col1" style="margin-top: 1px; ">
    <div class="portlet_my_classes" id="my_classes">
        <div class="eclass_list">
            <ul>
                <li>First item</li>
            </ul>
        </div>
    </div>
</div>

私のキャスパースクリプトは次のとおりです。

var casper = require('casper').create()

var classes = []

function getClasses() {
    var classes = document.querySelector(".eclass_list")
    return Array.prototype.map.call(classes, function(e) {
        return e.textContent
    })
}

casper.start('https://redacted', function() {
    this.echo(this.getTitle());
    this.fill('form[action="/do/account/login"]', {login: "redacted", password: "redacted"}, true)
});

casper.then(function() {
    this.echo(this.getHTML())
})

casper.thenOpen('https://redacted', function() {
    this.echo(this.getTitle())
    this.echo(this.getHTML())
    this.echo(this.evaluate(getClasses))
    this.echo(this.exists(".eclass_list"))
    require('utils').dump(this.getElementInfo(".eclass_list"))
    classes = this.evaluate(getClasses)
})

casper.run(function() {
    this.echo(classes).exit()
});

this.exists(".eclass_list")true を返しますが、classes は常に null です。

4

1 に答える 1

4

document.querySelector(".eclass_list")関数内でgetClassesは、このクラスを持つ最初の要素のみが配列としてではなく要素として返されます。したがって、 DOM 要素にはプロパティがなく、配列として解釈できないArray.prototype.mapため、DOM 要素の後続の呼び出しは失敗します。ページ コンテキスト内にlength例外 ( Chrome の場合) があるため、戻り値は になります。SyntaxError: Illegal return statementnull

あなたが欲しいのはですdocument.querySelectorAll(".eclass_list")

remote.messageおよびpage.errorイベントを追加していれば、問題が発生していたはずです。

于 2014-08-16T23:55:40.433 に答える