Ваш код для загрузки WebArchive в WebView выглядит правильно (я не очень знаком с PyObjC). Модифицировать DOM довольно легко, используя методы из API WebKit ( документация ). Сложность в том, как только вы изменили 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];
Это немного взломано, потому что оно опирается на внутреннюю структуру архивного формата, которая не документирована, но я думаю, что вы можете с уверенностью предположить, что она не изменится кардинально.