1. 程式人生 > >在Python中執行javascript

在Python中執行javascript

在使用python抓取網頁的過程中,有的時候需要執行某些簡單的javascript,以獲得自己需要的內容,例如執行js裡面的document.write或者document.getelementbyid等。自己解析js程式碼顯然有點吃力不討好,因此最好能找到一些可以解析執行js的python庫。

google之可以找到三個候選者,分別是微軟的scriptcontrol,v8的python移植pyv8,還有spidermonkey的python移植python-spidermonkey。其中scriptcontrol只能在windows上執行,需要win32com庫;pyv8能在windows和*nix上執行,但是需要裝pyv8庫;而spidermonkey是mozilla的js引擎在python上的移植,感覺已經不太活躍,因此沒用。

微軟的scriptcontrol中對執行js最重要的方法就是addobject與eval,通過addobject,我們可以向js執行環境注入一個我們自定義的document物件,通過eval方法,我們可以執行一段js程式碼。注入自定義物件需要使用win32com.server.util.wrap方法,將一個python物件包裝為com物件,例如假設我們想注入一個只實現了write方法的document物件,程式碼是這樣的:

import win32com.server.util, win32com.client

class win32doc:

_public_methods_ = ['write']

def write(self, s):

print s

doc = win32doc()

jsengine = win32com.client.dispatch('msscriptcontrol.scriptcontrol')

jsengine.language = 'javascript'

jsengine.allowui = false

jsengine.addobject('document', win32com.server.util.wrap(doc))

jsengine.eval('document.write("hello, world")')

在windows裡執行這段python程式碼,最終就會打印出hello, world來。如果我們希望從python裡讀取js通過document.write寫入的字串並進行解析,只要給上面的win32doc類新增對應的方法(例如read),就可以讀取並解析html程式碼,並進行進一步處理了。

對pyv8來說,原理也是類似的,不過在具體機制上有所不同而已。在pyv8中需要在初始化的時候加入一個全域性物件,其他的物件都是掛在全域性物件之下的,例如document只是全域性物件的一個屬性而已(實際上,document物件就是window物件的一個屬性麼),當然,這個屬性對應的實際上是一個物件。需要注意的是,pyv8在處理字串編碼的時候讓人很迷惑,在windows下它需要js的編碼為utf8,而在linux下只要求寬字串,即python裡的unicode,而在內部的字串都是utf8編碼的。至於為何如此,熊貓也騷擾過開發pyv8的flier,貌似是v8自己的feature。示例程式碼是這樣的:

import pyv8

class v8doc(pyv8.jsclass):

def write(self, s):

print s.decode('utf-8')

class global(pyv8.jsclass):

def __init__(self):

self.document = v8doc()

glob = global()

ctxt = pyv8.jscontext(glob)

ctxt.enter()

#or ctxt.eval(u'document.write("你好,中國")') for linux

ctxt.eval(u'document.write("你好,中國")'.encode('utf-8'))

上面只是在python裡模擬執行js的document.write的大體思路,如果還需要執行其他的js程式碼對dom樹進行操縱,那就一個個新增對應的方法好了。當然,這個新增也要保持一個限度,不然新增的方法太多,程式碼會非常複雜,相當於自己已經開始實現一個dom樹處理和解析的完全封裝了,如果是這樣,還不如使用自動化介面操縱瀏覽器,例如通過js/vbs操縱ie,或者在後臺進行自動化批處理的話,使用一些headless browser軟體,例如phantomjs,這就留待以後再說了。


======================================================
在最後,我邀請大家參加新浪APP,就是新浪免費送大家的一個空間,支援PHP+MySql,免費二級域名,免費域名繫結 這個是我邀請的地址,您通過這個連結註冊即為我的好友,並獲贈雲豆500個,價值5元哦!短網址是http://t.cn/SXOiLh我建立的小站每天訪客已經達到2000+了,每天掛廣告賺50+元哦,呵呵,飯錢不愁了,\(^o^)/

相關推薦

Python執行JavaScript程式碼並進行資料交換

閒言碎語不多講,今天介紹一下Python擴充套件庫pyexecjs。首先進入命令提示符環境,使用

Python執行javascript

在使用python抓取網頁的過程中,有的時候需要執行某些簡單的javascript,以獲得自己需要的內容,例如執行js裡面的document.write或者document.getelementbyid等。自己解析js程式碼顯然有點吃力不討好,因此最好能找到一些可以解析執行

python執行cmd的方式

ble open blog cli return 窗口 images about 定向 目前我使用到的python中執行cmd的方式有三種: 1. 使用os.system("cmd") 這是最簡單的一種方法,特點是執行的時候程序會打出cmd在Linux上執行的信息。使用

python執行命令行read結果

驅動 post log pre 變量 port http import 結果 import os r = os.popen(‘python -V‘).read() print(type(r)) print(r)    # os.system(‘python -

python執行shell的兩種方法總結

sleep follow 命令執行 inux 接收 以及 Go ber BE 這篇文章主要介紹了python中執行shell的兩種方法,有兩種方法可以在Python中執行SHELL程序,方法一是使用Python的commands包,方法二則是使用subprocess包,這

python執行shell命令的幾個方法

1.os.system() a=os.system("df -hT | awk 'NR==3{print $(NF-1)}'") 該命令會在頁面上列印輸出結果,但變數不會保留結果,只會保留返回的狀態碼. 2.os.popen() os.popen()返回的是 file read 的物件,但沒有狀

python執行命令的3種方法小結

原文地址:http://www.cnblogs.com/qytang/p/5566860.html 1. 使用os.system("cmd") 特點是執行的時候程式會打出cmd在linux上執行的資訊。 import os os.system("ls") &nbs

python執行緒threading的學習

python中tcp協議的學習 普通構建方式 import threading import time def test1(): for item in range(5): print('test1=======%s' % item)

Python+Selenium執行JavaScript,控制滾動條移動

執行js指令碼來控制瀏覽器豎向滾動條: 開啟百度貼吧,然後拖動滾動條到左側 “地區" # coding=utf-8 import time from selenium import webdrive

在chrome瀏覽器執行javascript

chrome瀏覽器中包含了開發者工具,chrome瀏覽器可謂是非常的強大啊,在chrome瀏覽器上F12就可以開啟開發者模式。如下圖所示: 下面給大家簡單演示一下使用jquery登陸csdn,首先開啟csdn的登陸頁面,然後開啟開發者工具,在控制檯執行如下命令即可。 ja

c# winform程式在WebBrowser控制元件執行javascript指令碼

來自:http://outofmemory.cn/code-snippet/1706/c-winform-program-WebBrowser-control-execution-javascript-script winform的WebBrowser控制元件,可以方便的載

Selenium2(WebDriver)執行JavaScript程式碼

在用selenium編寫web頁面的自動化測試程式碼時,可能需要執行一些JavaScript程式碼,selenium本身就支援執行js,我們在程式碼中可以使用executeScript、executeAsyncScript這兩個方法來執行JS。 exec

python執行命令列的方法

1.os.system(command) 該方法和C語言裡的system函式是一致的。該方法的引數就是string型別的命令,返回值方面,linux和windows上的返回值不同。linux上,返回

說說如何在 Java 執行 JavaScript 指令碼

Java 是強型別的靜態語言,即所有的程式碼在執行之前都必須先進行嚴格的型別檢查並編譯為 JVM 位元組碼。這樣做雖然保證了安全與效能,但卻犧牲了靈活性。而那些動態語言(JavaScript 、Python 等)卻可以在程式執行時改變程式的結構以及變數型別,因此

Python執行緒的建立方法:派生Thread子類

在看這個之前,我應該假設你對類已經很熟悉了。 什麼是超類,子類?怎麼派生子類?子類的繼承,子類對於超類方法的新增或是過載。這些如果很熟悉,就能看懂了,如果不是很熟悉,你可以去看看《Python學習手冊》,它的第六部分關於類介紹的很仔細,閱讀即可。 那麼接下來

python執行shell命令

col command import shel www html .cn class out 查看輸出結果 import os output = os.popen(‘cat 6018_gap_5_predict/solusion2/solusion2_0-1.txt

shell腳本執行python腳本並接收其返回值的例子

erl 結果 port ria 需要 deb def ID pri 1.在shell腳本執行python腳本時,需要通過python腳本的返回值來判斷後面程序要執行的命令 例:有兩個py程序 hello.py 復制代碼代碼如下: def main(): pri

Python parse.quote類似JavaScript encodeURI() 函數

int encodeuri java pri rom sre scrip ava pytho    from urllib import parse jsRet = ‘roleO%2f‘print(parse.unquote(jsRet))print(parse.quo

Python匯入自己寫的類,被劃紅線,但不影響執行

之前在學習Python+selenium的過程中,匯入自己寫的包檔案時,與之相關的方法等都會被劃紅線,但並不影響程式碼執行,如圖:   看著紅線確實有點強迫症,並且在這個過程當時,當使用該檔案裡的方法時不會自動提示方法名,只能靠手全部輸入,這種容易造成手誤,對於小白特別容易降低編寫效

程序和執行緒——Python的實現

一、程序(Process)     程序是一個實體。每一個程序都有它自己的地址空間,一般情況下,包括文字區域(text region)、資料區域(data region)和堆疊(stack region)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動