python执行javascript脚本文件_在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.clientclass win32Doc: _public_methods_ = ['write'] def write(self, s): print sdoc = win32Doc()jsengine = win32com.client.Dispatch('MSScriptControl.ScriptControl')jsengine.language = 'JavaScript'jsengine.allowUI = Falsejsengine.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 PyV8class 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 Linuxctxt.eval(u'document.write("你好,中国")'.encode('utf-8'))

上面只是在python里模拟执行js的document.write的大体思路,如果还需要执行其他的js代码对DOM树进行操纵,那就一个个添加对应的方法好了。当然,这个添加也要保持一个限度,不然添加的方法太多,代码会非常复杂,相当于自己已经开始实现一个DOM树处理和解析的完全封装了,如果是这样,还不如使用自动化接口操纵浏览器,例如通过js/vbs操纵IE,或者在后台进行自动化批处理的话,使用一些headless browser软件,例如phantomjs,这就留待以后再说了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39916549/article/details/111990033

智能推荐

STM32问题集之BOOT0和BOOT1的作用_stm32boot0和boot1作用-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏20次。一、功能及目的 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。BOOT1=x BOOT0=0 // 从用户闪存启动,这是正常的工作模式。BOOT1=0 BOOT0=1 // 从系统存储器启动,这种模式启动的程序_stm32boot0和boot1作用

C语言函数递归调用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏22次。C语言函数递归调用_c语言函数递归调用

明日方舟抽卡模拟器wiki_明日方舟bilibili服-明日方舟bilibili服下载-程序员宅基地

文章浏览阅读410次。明日方舟bilibili服是一款天灾驾到战斗热血的创新二次元废土风塔防手游,精妙的二次元纸片人设计,为宅友们源源不断更新超多的纸片人老婆老公们,玩家将扮演废土正义一方“罗德岛”中的指挥官,与你身边的感染者们并肩作战。与同类塔防手游与众不同的几点,首先你可以在这抽卡轻松获得稀有,同时也可以在战斗体系和敌军走位机制看到不同。明日方舟bilibili服设定:1、起因不明并四处肆虐的天灾,席卷过的土地上出..._明日方舟抽卡模拟器

基于图像的目标检测与定位方法概述_图像定位算法-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏97次。目录1. 目标检测与定位概念2. 目标检测与定位方法2.1 传统目标检测流程2.2 two-stage检测算法2.2.1 R-CNN2.2.2 two-stage其他算法2.2.2.1 Spatial Pyramid Pooling(空间金字塔池化)2.2.2.2 Fast-RCNN2.2.2.3 P11 Faster RCNN2.3 One-Stage2.3.1 YOLO2.3.2 SSD参考本文简单介绍基于图像的目标检测与定位相关概念,R-CNN和YOLO等算法基本思想。本文为学习笔记,参考了许多优_图像定位算法

数字图像处理Matlab-小波变换在图像处理中的应用(附代码)_小波分解与重构在图像处理的应用-程序员宅基地

文章浏览阅读9.8k次,点赞40次,收藏131次。目录1.Objectives:2.Experiment Content:3.Experiment Principle:4.Experiment Steps Result and Conlusion:1、了解各种小波性质2、观察各种小波函数及其尺度函数3、获得小波滤波器4、二维小波变换函数与重构函数5、查看及处理小波系数6、用小波变换进行图像压缩与边缘提取【附录】实现代码1.Objectives:..._小波分解与重构在图像处理的应用

如何把海思 Hi3556、Hi3559当ipc芯片使用_hi3556的固件可以刷hi3559吗-程序员宅基地

文章浏览阅读8k次。解决思路:1、网络方面:这两颗料没有网口,那么给linux系统端移植一颗usb转网卡的芯片即可,价格一两块RMB,可行。2、去掉middleware和reference层,直接在ndk层进行操作;3、如果对图像有要求,可以在相关接口扩展指令,从而达到间接使用mpi接口的目的;..._hi3556的固件可以刷hi3559吗

随便推点

5个高质量简历模板网站,免费、免费、免费_hoso模板官网-程序员宅基地

文章浏览阅读10w+次,点赞42次,收藏309次。今天给大家推荐5个好用且免费的简历模板网站,简洁美观,非常值得收藏!1、菜鸟图库https://www.sucai999.com/search/word/0_242_0.html?v=NTYxMjky网站主要以设计类素材为主,办公类素材也很多,简历模板大部个偏简约风,各种版式都有,而且经常会更新。最重要的是全部都能免费下载。2、个人简历网https://www.gerenjianli.com/moban/这是一个专门提供简历模板的网站,里面有超多模板个类,找起来非常方便,风格也很多样,无须注册就能免费下载,_hoso模板官网

通过 TikTok 联盟提高销售额的 6 个步骤_tiktok联盟-程序员宅基地

文章浏览阅读142次。你听说过吗?该计划可让您以推广您的产品并在成功销售时支付佣金。它提供了新的营销渠道,使您的产品呈现在更广泛的受众面前并提高品牌知名度。此外,TikTok Shop联盟可以是一种经济高效的产品或服务营销方式。您只需在有人购买时付费,因此不存在在无效广告上浪费金钱的风险。这些诱人的好处是否足以让您想要开始您的TikTok Shop联盟活动?如果是这样,本指南适合您。_tiktok联盟

Mysql递归调用,报错:Subquery returns more than 1 row-程序员宅基地

文章浏览阅读2.1k次。Mysql递归调用,报错:Subquery returns more than 1 row_subquery returns more than 1 row

割线定理-程序员宅基地

文章浏览阅读3.2k次。文字表达:从圆外一点引圆的两条割线,这一点到每条割线与圆交点的距离的积相等。数学语言:从圆外一点L引两条割线与圆分别交于A.B.C.D 则有 LA·LB=LC·LD=LT²。几何语言:∵割线LDC和LBA交于圆O于ABCD点∴LA·LB=LC·LD=LT²证明过程:证1:已知:如图直线ABP和CDP是自点P引的⊙O的两条割线求证:PA·PB=PC·PD证明:连接AD、BC∵∠A和∠C都对弧BD∴由圆周角定理,得 ∠DAP=∠BCP又∵∠P=∠P∴△ADP._割线定理

ThinkPHP3.2.3-文章管理系统-附带源码地址_thinkphp3.2.3 源码下载-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏7次。一.前言本项目为文章管理系统,系统相对简单。但代码比较规范,适合作为第一个thinkphp项目,有需要的朋友可以看看。Thinkphp版本为3.2.3。涉及到的知识:验证码,文件上传、登录、自动完成、自动验证等。二.简介1.本系统有前台、后台两个模块。2.后台模块功能:栏目管理、文章管理、管理员信息修改。实现了需登录才可进入系统。3.前台_thinkphp3.2.3 源码下载

SpringMVC 中 Controller 是单例还是多例?如何保证并发安全?-程序员宅基地

文章浏览阅读1.4k次。点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方有惊喜留言必回,有问必答!每一天进步一点点,是成功的开始...单例模式(Singleton)是程序设计中一种非常重要的设计模式,设计模式也是Java面试重点考察的一个方面。面试经常会问到的一个问题是:SpringMVC中的Controller是单例还是多例,很多同学可能会想当然认为Control..._controller是多线程的吗?如何保证线程安全