在Python中执行javascript

本文介绍如何在Python中执行JavaScript代码,如document.write和getElementById,以获取网页内容。详细介绍了scriptcontrol、pyv8和python-spidermonkey三个库的使用方法,并通过示例代码演示了如何在Python中调用JavaScript的document.write方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用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^)/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值