2016-07-26 11 views
0

PhantomJSを使用して、指定されたWebページ内のすべての画像src urlのリストを取得しようとしています。私の理解は、これは非常に簡単なはずですが、どのような理由であれ、私はそれを機能させることができません。ここで私は、現在持っているコードは次のとおりです。Scrape image src PhantomJSを使用したURL

var page = require('webpage').create(); 
page.open('http://www.walmart.com'); 

page.onLoadFinished = function(){ 
    var images = page.evaluate(function(){ 
     return document.getElementsByTagName("img"); 
    }); 
    for(thing in a){ 
     console.log(thing.src); 
    } 
    phantom.exit(); 
} 

私もこの試みた:私もの画像を反復処理しようとした

var page = require('webpage').create(); 
page.open('http://www.walmart.com', function(status){ 
    var images = page.evaluate(function() { 
     return document.images; 
    }); 
    for(image in images){ 
     console.log(image.src); 
    } 
    phantom.exit(); 
}); 

var a = page.evaluate(function(){ 
    returnStuff = new Array; 
    for(stuff in document.images){ 
     returnStuff.push(stuff); 
    } 
    return returnStuff; 
}); 

そして、これを関数を評価し、そのように.srcプロパティを取得する。
意味のあるものは返されません。 document.imagesの長さを返すと、そのページには54のイメージがありますが、それらを反復しようとすると便利なものはありません。

はまた、私は、次の他の質問を見て、彼らが提供された情報を使用することができませんでしたしました:How to scrape javascript injected image src and alt with phantom.jsHow to download images from a site with phantomjs

は再び、私は元のURLをしたいです。私は実際のファイルそのものは必要ありません。助けてくれてありがとう。

UPDATE
私はそれはstuff.getAttribute( 'SRC')はundefinedを返しますというエラーを投げた

var a = page.evaluate(function(){ 
    returnStuff = new Array; 
    for(stuff in document.images){ 
     returnStuff.push(stuff.getAttribute('src')); 
    } 
    return returnStuff; 
}); 

を使用してみました。それがどうしていいのか?

+1

var page = require('webpage').create(); page.onLoadFinished = function(){ var urls = page.evaluate(function(){ var image_urls = new Array; var images = document.getElementsByTagName("img"); for(q = 0; q < images.length; q++){ image_urls.push(images[q].src); } return image_urls; }); console.log(urls.length); console.log(urls[0]); phantom.exit(); } page.open('http://www.walmart.com'); 
'はconsole.log([] map.call(document.images、A => a.src))' – dandavis

答えて

2

@MayorMontyがほとんどありました。実際、HTMLCollectionを返すことはできません。 docs sayとして

注:評価関数の引数と戻り値は、単純なプリミティブオブジェクトでなければなりません。経験則:JSONを使ってシリアル化できるのであれば問題ありません。

クロージャ、関数、DOMノードなどは機能しません!

したがって作業スクリプトは次のようである:

+0

私のコンソールから得られた結果から私の答えを引き離すために私を表示します。 ;) – MayorMonty

+0

ありがとうございました。完璧に動作します – gseccles

0

私は直接JavaScriptの方法について確認していないが、最近、私はあなたがjQueryの

$('.someclassORselector').each(function(){ 
    data['src']=$(this).attr('src'); 
    }); 
+0

のjQueryはありませんphantomJSでパッケージ化されていますが、これはそれを使用するサイトでのみ動作します – MayorMonty

+0

実際にあなたはどんなウェブサイトでもjQueryを挿入できます。また、Horseman.jsを見たいかもしれません – abhirathore2006

+0

ここを見てくださいhttp://phantomjs.org/api/webpage /method/inject-js.html – abhirathore2006

0

document.images注入した後、以下のスタイルでスクリプトを記述したノードの配列ではないことができるように画像やその他のデータをこすりするためのjQueryを使用し、 Objectで構築されたHTMLCollectionです。

for (a in document.images) { 
    console.log(a) 
} 

プリント:今

0 
1 
2 
3 
length 
item 
namedItem 

、この解決には、いくつかの方法があります。

  1. ES6スプレッド演算子は:これは、アレイ同類をオンにしますfor..inそれ場合は、これを見ることができます配列に反復可能です。そのように使用する[...document.images]
  2. Regular forループのように、配列のように。あなたはmapかのように、それに配列関数を使用することができます解決策1を使用して

    for(var i = 0; i < document.images.length; i++) { 
        document.images[i].src 
    } 
    

そしておそらくより、同様

:これは、キーが配列のようにラベル付けされているという事実を利用しますreduceですが、(phantomのjavascriptの現在のバージョンでサポートされている場合はidkが少ない)サポートがあります。

関連する問題