Właściwie łatwiej odpowiedzieć na drugie pytanie. Spójrz na stringWithContentsOfURL:encoding:error:
metodę NSString - umożliwia ona przekazanie adresu URL jako instancji NSURL (która może być łatwo utworzona z NSString) i zwraca ciąg z pełną zawartością strony pod tym adresem URL. Na przykład:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
Po uruchomieniu ten kod googlePage
będzie zawierał kod HTML witryny www.google.com oraz error
wszelkie błędy napotkane podczas pobierania. (Powinieneś sprawdzić zawartość error
po pobraniu.)
Przejście w drugą stronę (z UIWebView) jest nieco trudniejsze, ale zasadniczo jest to ta sama koncepcja. Będziesz musiał wyciągnąć żądanie z widoku, a następnie wykonać pobieranie jak wcześniej:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
EDYCJA: Obie te metody mają jednak wpływ na wydajność, ponieważ wykonują żądanie dwukrotnie. Możesz obejść ten problem, pobierając zawartość z aktualnie załadowanego UIWebView za pomocą jego stringByEvaluatingJavascriptFromString:
metody, takiej jak:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Spowoduje to pobranie bieżącej zawartości HTML widoku za pomocą modelu obiektu dokumentu, przeanalizuje JavaScript, a następnie przekaże ją jako NSString * HTML.
Innym sposobem jest najpierw wykonanie żądania programowo, a następnie załadowanie UIWebView z tego, o co prosiłeś. Powiedzmy, że weźmiesz drugi przykład powyżej, w którym masz NSString *page
wynik połączenia z stringWithContentsOfURL:encoding:error:
. Następnie możesz wypchnąć ten ciąg do widoku internetowego za pomocą loadHTMLString:baseURL:
, zakładając, że trzymałeś się również żądanego NSURL:
[yourWebView loadHTMLString:page baseURL:requestURL]
Nie jestem jednak pewien, czy uruchomi to JavaScript znaleziony na ładowanej stronie (nazwa metody,, loadHTMLString
jest nieco niejednoznaczna, a dokumentacja nie mówi o tym zbyt wiele).
Po więcej informacji:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
kilkakrotnie uratował mi życie. Wydaje się, że w miarę możliwości powraca z dokumentu.jeśli chcesz wyodrębnić zawartość już załadowanego UIWebView, -stringByEvaluatingJavaScriptFromString. Na przykład:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
źródło
Aby uzyskać całe nieprzetworzone dane HTML (z
<head>
i<body>
):NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
źródło
Należy zauważyć, że ciąg NSString stringWithContentsOfURL zgłosi zupełnie inny ciąg agenta użytkownika niż UIWebView wykonujący to samo żądanie. Więc jeśli twój serwer jest świadomy agenta użytkownika i odsyła inny kod HTML w zależności od tego, kto o to prosi, możesz w ten sposób nie uzyskać poprawnych wyników.
Zwróć również uwagę, że
@"document.body.innerHTML"
wspomniane powyżej wyświetli tylko to, co znajduje się w tagu body. Jeśli użyjesz@"document.all[0].innerHTML"
, otrzymasz zarówno głowę, jak i ciało. Co nadal nie jest pełną zawartością UIWebView, ponieważ nie odzyska on tagów! Doctype ani html, ale jest znacznie bliżej.źródło
Czytać:-
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"]; NSLog(html);
Modyfikować:-
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
źródło
W Swift v3:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
źródło
(Xcode 5 iOS 7) Przykład aplikacji uniwersalnej dla iOS 7 i Xcode 5. Jest to projekt / przykład typu open source znajdujący się tutaj: Link do SimpleWebView (przykład kodu pocztowego i kodu źródłowego projektu)
źródło
Używam szybkiego rozszerzenia, takiego jak to:
extension UIWebView { var htmlContent:String? { return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML") } }
źródło
powinieneś spróbować tego:
document.documentElement.outerHTML
źródło
UIWebView
pobierz HTML z UIWebView`
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
ustaw HTML w UIWebView
//Do not forget to extend a class from `UIWebViewDelegate` and nil the delegate func someFunction() { let uiWebView = UIWebView() uiWebView.loadHTMLString("<html><body></body></html>", baseURL: nil) uiWebView.delegate = self as? UIWebViewDelegate } func webViewDidFinishLoad(_ webView: UIWebView) { //ready to be processed }
[pobierz / ustaw kod HTML z WKWebView]
źródło