5

假设我们有 PyV8:

import PyV8
ctxt = PyV8.JSContext()

和一个 python DOM 结构,例如xml.dom

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

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

我希望删除 dom 项。

PyV8有完美的 hello-world 示例。但我想看看有用的东西。

说清楚,我想做的是:
"Javascript file"-->--魔法-->--DOM, (already built with html file) and changed now with passed javascript file

4

2 回答 2

4

可以在这里找到您尝试做的一个很好的例子:

https://github.com/buffer/thug

它是一个 python http 客户端,通过 PyV8 执行 JS 用于安全研究目的,但可以很容易地捆绑起来以满足更简单的需求。

于 2012-12-08T09:10:20.840 回答
2

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

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

在下面找到一个部分示例。(请注意,HTML 标准是庞大的、分散的,并且 _highly 浏览器特定,因此您的 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()
于 2012-06-20T04:44:38.730 回答