2017-12-13 7 views
0

私はWebスクレイピングツールを開発しようとしています。私はPythonスクリプトとJavaScriptコードを持っています.PythonスクリプトはJavaScriptコードを呼び出します。私のjavascriptコードはウェブページから関連するコンテンツを検索します。このコンテンツをPythonスクリプトに返します。 Javascriptコードはブラウザで手動で実行するとうまく動作します。 これは私のjsのコードです:selenium.common.exceptions.WebDriverException:メッセージ:TypeError:p [0]が定義されていません

var doc = "" 
var path1 = document.getElementsByClassName("entry-header")[0] 
doc = doc + path1.innerText 
doc = doc + "\n" 
var path2 = document.getElementsByClassName("entry-content")[0] 
var cont = path2.getElementsByTagName("p") 
for (var i=0; i<cont.length; i++) 
{ 
    doc = doc+cont[i].innerText 
    doc = doc+ "\n" 
} 

res() 

function res() 
{ 
    return doc 
} 

そして、ここでは私のpythonのコードです:

from selenium import webdriver 
js = open("generalized.js", "r").read() 
driver = webdriver.Firefox() 
browser = webdriver.Firefox() 
browser.get("http://www.geeksforgeeks.org/branch-and-bound-set-1-  introduction-with-01-knapsack/") 
result = driver.execute_script(js) 
print result 

しかし、パイソンを通じて呼び出されたときには、エラー、次の私を与えます。

Traceback (most recent call last): 
File "sample.py", line 7, in <module> 
result = driver.execute_script(js) 
File "/home/sagar/anaconda2/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 543, in execute_script 
'args': converted_args})['value'] 
File "/home/sagar/anaconda2/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute 
self.error_handler.check_response(response) 
File "/home/sagar/anaconda2/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response 
raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: TypeError: p[0] is undefined 

この問題を解決するのを手伝ってください。または、Webスクレイピングのための他の方法はありますか?

+1

、あなたが意図的にナビゲートしている、URLの内側にそのスペースのですか? – alecxe

答えて

0

何らかの理由で2つのブラウザを起動していますが、空のページを開いた状態でブラウザでスクリプトを実行しています。これは、私の作品:

from selenium import webdriver 
import time 

js = open("generalized.js", "r").read() 

browser = webdriver.Firefox() 
browser.get("http://www.geeksforgeeks.org/branch-and-bound-set-1-introduction-with-01-knapsack/") 

time.sleep(1) # try to replace with an Explicit Wait 
result = browser.execute_script(js) 
print(result) 

トップレベルでreturn docを有する変性スクリプトでは:ところで

var doc = ""; 
var path1 = document.getElementsByClassName("entry-header")[0]; 
doc = doc + path1.innerText; 
doc = doc + "\n"; 
var path2 = document.getElementsByClassName("entry-content")[0]; 
var cont = path2.getElementsByTagName("p"); 
for (var i=0; i<cont.length; i++) 
{ 
    doc = doc+cont[i].innerText; 
    doc = doc+ "\n" 
} 

return doc; 
+0

だから問題は2つのブラウザが開き、jsスクリプトが空のブラウザで実行されていたことです。私はその問題を解決しました。現在、ブラウザウィンドウは1つだけ開いています。しかし今、私は結果をNoneにしています。 –

+1

@SagarDeshpandeあなたは答えのようにトップレベルに 'return doc'を置いていますか? – alecxe

+0

はい.. jsが実行されたときにDOMオブジェクトが準備されていないためですか? –

関連する問題