我可以访问 .webarchive 文件。到目前为止,我已经设法从文件中创建了一个 webarchive(使用 PyObjC)。我希望修改 DOM 树中的一些元素并将修改后的数据写出来。
我想我需要访问一些给定 WebArchive 的根 DOM 树(webarchive 是一个网页,没有链接)。
有谁知道如何在 Cocoa 中做到这一点?谢谢
我可以访问 .webarchive 文件。到目前为止,我已经设法从文件中创建了一个 webarchive(使用 PyObjC)。我希望修改 DOM 树中的一些元素并将修改后的数据写出来。
我想我需要访问一些给定 WebArchive 的根 DOM 树(webarchive 是一个网页,没有链接)。
有谁知道如何在 Cocoa 中做到这一点?谢谢
您将 WebArchive 加载到 WebView 中的代码看起来是正确的(我对 PyObjC 不是很熟悉)。使用 WebKit API(文档)中的方法修改 DOM 非常简单。棘手的一点是,一旦您修改了 DOM,并且想要将修改写回 WebArchive。简单地保存一个新的 WebArchive 是行不通的,因为这不会保留您的修改,因此您需要编写新的源。这是一些可以做到这一点的代码(这里是 WebView webview
,原始的 WevArchive 位于 archivePath 并且修改后的版本也将在那里写入):
//Get the string representation of the current DOM tree
NSString *sourceString = [(DOMHTMLElement *)[[[webview mainFrame] DOMDocument] documentElement] outerHTML];
NSData *sourceData = [sourceString dataUsingEncoding:NSUTF8StringEncoding];
//Load the archive from disk to a dictionary (it's a plist)
NSMutableDictionary *archive = [[NSMutableDictionary alloc] initWithContentsOfURL:[NSURL fileURLWithPath:archivePath]];
//Modify the main HTML
[(NSMutableDictionary *)[archive objectForKey:@"WebMainResource"] setObject:sourceData forKey:@"WebResourceData"];
//Write the plist back out
NSData *data = [NSPropertyListSerialization dataFromPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 errorDescription:nil];
[data writeToURL:[NSURL fileURLWithPath:ArchivePath] atomically:YES];
这有点像 hack,因为它依赖于未记录的存档格式的内部结构,但我认为您可以非常安全地假设它不会发生巨大变化。
可能的解决方案(尚未检查)
from Foundation import *
import objc
import WebKit
from WebKit import *
d=NSData.dataWithContentsOfFile_("/tmp/x.webarchive")
ws=WebArchive.alloc().initWithData_(d)
wv=WebView.alloc().initWithFrame_frameName_groupName_(((100, 100),(100,100)), "foo",None)
mf=wv.mainFrame()
mf.loadArchive_(ws)