2011-11-27 14 views
27

मैं एक वेब scraping परियोजना पर काम कर रहा हूँ। जिन वेबसाइटों के साथ मैं काम कर रहा हूं उनमें से एक जावास्क्रिप्ट से डेटा आ रहा है।मैं अजगर से एक जावास्क्रिप्ट समारोह कैसे कहते हैं?

one of my earlier questions पर एक सुझाव था कि मैं सीधे पाइथन से जावास्क्रिप्ट को कॉल कर सकता हूं, लेकिन मुझे यकीन नहीं है कि इसे कैसे पूरा किया जाए।

उदाहरण के लिए: एक जावास्क्रिप्ट समारोह के रूप में परिभाषित किया गया है: add_2(var,var2)

मैं कैसे कहेंगे कि अजगर से जावास्क्रिप्ट समारोह?

+1

अगर यह कुछ आप जानते हैं और आसानी से अनुकरण कर सकते हैं है, यह पार्स और यह अपने आप व्याख्या करने के लिए सबसे आसान हो सकता है। यदि नहीं, तो आप जावास्क्रिप्ट इंजन में जुड़ने की आवश्यकता समाप्त कर सकते हैं। –

उत्तर

9

एक जावास्क्रिप्ट दुभाषिया पायथन बाइंडिंग है कि पता लगाएं। (राइनो का प्रयास करें? वी 8? सागरमकी?)। जब आपको एक मिल गया है, तो इसे पाइथन से इसका उपयोग करने के उदाहरणों के साथ आना चाहिए।

पाइथन स्वयं, हालांकि, जावास्क्रिप्ट दुभाषिया शामिल नहीं है।

+4

आपको निश्चित रूप से [pyv8] (http://code.google.com/p/pyv8/) देखना चाहिए जो Google के V8 इंजन के लिए एक पायथन रैपर प्रदान करता है। [यह] (http://devzone.zend.com/1480/using-javascript-in-php-with-pecl-and-spidermonkey/) में स्पाइडरमोन्की के साथ अजगर का उपयोग करने के बारे में जानकारी शामिल है। उम्मीद है की यह मदद करेगा। – Codahk

+3

यदि आप एक से अधिक जावास्क्रिप्ट इंजन का समर्थन करना चाहते हैं, तो आपको [PyExecJS] (https://pypi.python.org/pypi/PyExecJS) पर एक नज़र रखना चाहिए – Wienczny

5

जावास्क्रिप्ट अजगर से मैं वेबकिट उपयोग करते हैं, जो क्रोम और सफारी के पीछे ब्राउज़र रेंडरर है के साथ बातचीत करने के लिए। Python bindings to webkit through Qt हैं। विशेष रूप से evaluateJavaScript() नामक जावास्क्रिप्ट को निष्पादित करने के लिए एक फ़ंक्शन है।

यहाँ एक पूर्ण example to execute JavaScript and extract the final HTML है।

+0

लिंक टूटा हुआ है! मैं अब तक इस समाधान का उपयोग कर रहा हूं जो एक मॉड्यूल के साथ है जो पीईक्यूटी 4 के साथ आसान बातचीत करता है जिसे स्पिनर – c24b

+0

कहा जाता है, सिर के लिए धन्यवाद - निश्चित लिंक – hoju

2

आप अंततः पेज से JavaScript हो और (जैसे v8 या राइनो के रूप में) कुछ दुभाषिया के माध्यम से यह निष्पादित कर सकते हैं। हालांकि, आप Selenium या Splinter जैसे कुछ कार्यात्मक परीक्षण टूल का उपयोग कर एक आसान तरीके से एक अच्छा परिणाम प्राप्त कर सकते हैं। ये समाधान ब्राउज़र लॉन्च करते हैं और पेज को प्रभावी ढंग से लोड करते हैं - यह धीमा हो सकता है लेकिन यह सुनिश्चित करता है कि अपेक्षित ब्राउज़र प्रदर्शित सामग्री उपलब्ध होगी।

<html> 
    <head> 
     <title>Test</title> 
     <script type="text/javascript"> 
      function addContent(divId) { 
       var div = document.getElementById(divId); 
       div.innerHTML = '<em>My content!</em>'; 
      } 
     </script> 
    </head> 
    <body> 
     <p>The element below will receive content</p> 
     <div id="mydiv" /> 
     <script type="text/javascript">addContent('mydiv')</script> 
    </body> 
</html> 

स्क्रिप्ट नीचे किरच का उपयोग करेगा:

उदाहरण के लिए, नीचे HTML दस्तावेज़ पर विचार करें। खपच्ची फ़ायरफ़ॉक्स का शुभारंभ करेंगे और पेज की पूरी लोड के बाद यह सामग्री जावास्क्रिप्ट द्वारा एक div को जोड़ा मिल जाएगा:

from splinter.browser import Browser 
import os.path 

browser = Browser() 
browser.visit('file://' + os.path.realpath('test.html')) 
elements = browser.find_by_css("#mydiv") 
div = elements[0] 
print div.value 

browser.quit() 

परिणाम stdout में मुद्रित सामग्री हो जाएगा।

+0

सेलेनियम दूसरी तरफ बहुत भारी है, मुझे स्प्लिंटर नहीं पता था। Spynner के लिए प्रयुक्त (PyQT4 + autopy के शीर्ष पर) – c24b

3

हाल ही में एक दिलचस्प विकल्प जिसे मैंने हाल ही में खोजा है वह पाइथन bond मॉड्यूल है, जिसका उपयोग नोडजेस प्रक्रिया (v8 इंजन) के साथ संवाद करने के लिए किया जा सकता है।

प्रयोग बहुत pyv8 बाइंडिंग करने के समान होगा, लेकिन आप सीधे संशोधन के बिना किसी भी NodeJS पुस्तकालय, जो मेरे लिए एक प्रमुख विक्रय बिंदु है उपयोग कर सकते हैं।

आपका अजगर कोड इस तरह दिखेगा:

val = js.call('add2', var1, var2) 

या यहाँ तक कि:

add2 = js.callable('add2') 
val = add2(var1, var2) 

कॉलिंग कार्यों हालांकि निश्चित रूप से pyv8 की तुलना में धीमी है, इसलिए यह बहुत अपनी आवश्यकताओं पर निर्भर करता है। यदि आपको npm पैकेज का उपयोग करने की आवश्यकता है जो बहुत भारी भारोत्तोलन करता है, bond बहुत अच्छा है। आप समानांतर में चलने वाली अधिक नोडजेज़ प्रक्रियाएं भी कर सकते हैं।

लेकिन यदि आपको केवल जेएस कार्यों का एक गुच्छा कॉल करने की आवश्यकता है (उदाहरण के लिए, ब्राउज़र/बैकएंड के बीच समान सत्यापन कार्य करने के लिए), pyv8 निश्चित रूप से बहुत तेज़ होगा।

0

हाल ही में विभिन्न विधियों का पूरा रन-डाउन किया।

PyQt4 Node.js/ phantomjs

zombie.js Phantomjs विजेता हाथ था नीचे, उदाहरण के बहुत सारे के साथ बहुत सरल।

+1

आप प्रश्न का उत्तर देने के बजाय कोड स्निपेट जोड़कर इस उत्तर को बेहतर बना सकते हैं। –

0

आप पॉपन के माध्यम से नोड को कॉल कर सकते हैं।

My example how to do it

print execute('''function (args) { 
    var result = 0; 
    args.map(function (i) { 
     result += i; 
    }); 
    return result; 
}''', args=[[1, 2, 3, 4, 5]]) 
+1

कृपया अपने उत्तर के हिस्से के रूप में कोड स्निपेट शामिल करें। –

संबंधित मुद्दे