PyV8,我可以操纵DOM结构吗?

时间:2012-06-19 14:31:51

标签: python v8

让我们假设我们有PyV8:

import PyV8
ctxt = PyV8.JSContext()

和python DOM结构,例如xml.dom

如何将.js文件提供给PyV8,以便它可以改变我拥有的DOM结构。
如果我有它的内容:

$("#id").remove();

我想删除dom项目。

PyV8有完美的问候世界的例子。但我希望看到一些有用的东西。

要明确,我想要做的是:
"Javascript file" - > - 魔术 - > - DOM, (already built with html file) and changed now with passed javascript file

2 个答案:

答案 0 :(得分:4)

你可以在这里找到一个很好的例子:

https://github.com/buffer/thug

这是一个python http客户端,通过PyV8执行JS以进行安全研究,但可以轻松地将其简化为更简单的需求。

答案 1 :(得分:2)

格式化的应用。我尽可能地间隔,但我的屏幕阅读器不喜欢SO的格式化控件。

我打算回答你的问题,虽然看起来有点模糊。如果我需要重写这个答案以适应不同的情况,请告诉我。 我假设您正在尝试从Web获取HTML文件,并从此文件中运行Javascript,以对该文档执行操作。 不幸的是,没有一个Python xml库具有真正的DOM支持,并且在我找到的每个包中都不存在W3C DOM合规性。 你可以做的是使用PyV8 w3c.py dom文件作为起始示例,并创建自己的完整DOM。 W3C Sample Dom 但是,您需要重写此模块,因为它不尊重引号或撇号。 BeautifulSoup也不是最快的解析器。 我建议使用类似lxml.etree的目标解析器选项。 LXML Target Parser 搜索“Feed解析器界面”。 然后,您可以使用LXML加载HTML /脚本文档,按如下所示进行解析,并在创建的DOM上运行所需的每个脚本。

在下面找一个部分示例。 (请注意,HTML标准是大规模的,分散的,并且具有特定的浏览器特性,因此您的milage可能会有所不同。)

class domParser(object):
    def __init__(self):
    #initialize dom object here, and obtain the root for the destination file object.
        self.dom = newAwesomeCompliantDom()
        self.document = self.dom.document
        self.this = self.document

    def comment(self, commentText):
    #add commentText to self.document or the above dom object you created
        self.this.appendChild(self.document.DOMImplementation.createComment(commentText))

    def start(self, tag, attrs):
    #same here
        self.this = self.this.appendChild(self.document.DOMImplimentation.newElement(tag,attrs))

    def data(self, dataText):
    #append data to the last accessed element, as a new Text child
        self.this.appendChild(self.document.DOMImpl.createDataNode(dataText))

    def end(self):
    #closing element, so move up the tree
        self.this = self.this.parentNode

    def close(self):
        return self.document

#unchecked, please validate yourself
x = lxml.etree.parse(target=domParser)
x.feed(htmlFile)
newDom = x.close()