在python中执行print3+5的结果是,在python中执行print11+11

  在python中执行print3+5的结果是,在python中执行print11+11

  在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上的移植,感觉不活跃,没用。

  在Microsoft ScriptControl中执行js最重要的方法是addObject和eval。通过addObject,我们可以在js执行环境中注入一个自定义的文档对象,通过eval,我们可以执行一段js代码。注入自定义对象需要使用win32com.server.util.wrap方法将python对象包装为com对象。例如,假设我们想要注入一个只实现write方法的文档对象。代码是这样的:

  导入win32com.server.util,win32com.client

  win32Doc类:

  _public_methods_=[write]

  定义写入(自身,秒):

  打印s

  doc=win32Doc()

  jsengine=win32 com . client . dispatch( msscript control。script control’)

  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中通过document.write读取和解析js编写的字符串,只需要在上面的win32Doc类中添加相应的方法(比如read),然后就可以读取和解析HTML代码并进一步处理。

  对于PyV8来说,原理差不多,只是具体机制不同。在PyV8中,初始化时需要添加一个全局对象,其他对象挂在全局对象下。比如document只是全局对象的一个属性(实际上document对象是window对象的一个属性)。当然,这个属性对应一个对象。需要注意的是,PyV8在处理字符串编码的时候比较混乱。在windows下,要求js编码为UTF8,而在Linux下,只要求宽字符串,也就是python中的unicode,而内部字符串都是UTF8编码。至于为什么,熊猫还骚扰开发PyV8的flier,这好像是V8自己的特色。代码是这样的:

  导入PyV8

  v8Doc类(PyV8。JSClass):

  定义写入(自身,秒):

  打印s . decode(“utf-8”)

  类全局(PyV8。JSClass):

  def __init__(self):

  self.document=v8Doc()

  glob=全局()

  ctxt=PyV8。JSContext(全球)

  ctxt.enter()

  适用于Linux的# orxt . eval(u document . write( Hello,China ))

  Ctxt.eval(udocument.write(你好,中国))。encode(utf-8 ))以上只是用python模拟js的document.write的大概思路。如果需要执行其他js代码来操作DOM树,只需逐个添加相应的方法即可。当然,这种添加也要保持一个限度,否则添加的方法太多,代码会非常复杂,相当于你已经开始实现DOM树处理和解析的完整封装了。如果是这样的话,最好使用自动化的界面来操作浏览器,比如通过js/vbs的IE,或者在后台进行自动化的批处理,使用一些无头浏览器软件,比如后面会讲到的phantomjs。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: