0

私は Phantomjs の初心者なので、自分で解決できない問題がたくさんあります。この問題を解決するのを手伝ってくれませんか? Phantomjs による複数の動的 URL の取得に問題があります。

例:

-- 私の index.html は次のとおりです。

<!DOCTYPE html>
<html>
<body>
<h1>Homepage</h1>
<ul>
    <li><a href="laptop.html">Laptop</a></li>
    <li><a href="tablet.html">Tablet</a></li>
</ul>
</body>
</html>

-- 私の laptop.html ファイル (tablet.html ファイルと同じ) は次のとおりです。

<!DOCTYPE html>
<html>
<body>
<h1>Laptop Page</h1>
<div class="productRow">Product of Laptop 1</div>
<div class="productRow">Product of Laptop 2</div>
</body>
</html>

私はこのように印刷したい:

Category Name: Laptop
Product: Product of Laptop 1
Product: Product of Laptop 2
....

Category Name: Tablet
Product: Product of Tablet 1
Product: Product of Tablet 2
...

この URL http://abc.com/test/のコンテンツを取得したいということです。次に、( UL LI A HREF) のリンクを取得します。そして、それらのリンクをたどって、サブページのコンテンツを自動的に取得します。

これは、Phantomjs による私のサンプル コードです。

var page = require('webpage').create();
var url  = 'http://localhost/test';

page.open(url, function() {
    //Get parent link
    var parent = page.evaluate(function() {
        var test = document.querySelectorAll('li a');
        return Array.prototype.map.call(test, function(elem) {
            return elem.href;       
        });
    });
    for(var i=0; i < parent.length; i++){
        //Print parent link 
        console.log("Parent link:" + parent[i]);

        //Then open child link          
        page.open(parent[i],function(){         
            //console.log(document.title);          
            var child = page.evaluate(function() {
                var test = document.querySelectorAll('div.productRow');
                return Array.prototype.map.call(test, function(elem) {
                    return elem.innerHTML;      
                });
            }); 
            console.log(child.length);
            phantom.exit();
        });

    }

});

なぜ console.log(child.length) = 0 なのですか? 手伝って頂けますか?ご協力いただきありがとうございます。

4

1 に答える 1

0

このように試してみてください。うまくいくはずです。もちろん、parent配列が正しいリンクで適切に埋められていると仮定しています。

var child = page.evaluate(function() {
    return [].map.call(document.querySelectorAll('div.productRow'), function(div) {
        return div.innerHTML;
    });
});
于 2014-07-04T05:59:37.957 に答える