在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)。文字區域儲存處理器執行的程式碼;資料區域儲存變數和程序執行期間使用的動