Czytanie zawartości HTML z UIWebView

Czy jest możliwe odczytanie surowej zawartości HTML strony internetowej, która została załadowana do UIWebView?

Jeśli nie, czy istnieje inny sposób na pobranie surowej zawartości HTML ze strony internetowej w SDK iPhone ' a (taki jak odpowiednik. NET WebClient::openRead)?

Author: Vertexwahn, 2009-06-14

9 answers

Na drugie pytanie łatwiej odpowiedzieć. Zobacz też stringWithContentsOfURL:encoding:error: metoda NSString-pozwala przekazać adres URL jako instancję NSURL (którą można łatwo utworzyć z NSString) i zwraca ciąg znaków 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 tego kodu googlePage będzie zawierał HTML dla www.google.com, oraz error będzie zawierać wszelkie błędy napotkane podczas pobierania. (Należy sprawdzić zawartość error po aport.)

Przechodzenie 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ć fetch jak wcześniej:

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];

EDIT: obie te metody mają jednak negatywny wpływ na wydajność, ponieważ wykonują żądanie dwa razy. Można to obejść, pobierając zawartość z aktualnie załadowanego UIWebView za pomocą metody stringByEvaluatingJavascriptFromString:, jako takiej:

NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString: 
                                         @"document.body.innerHTML"];

To pobierze bieżący HTML zawartość widoku używając modelu obiektowego dokumentu, przeanalizuj JavaScript, a następnie przekaż go jako NSString* HTML.

Innym sposobem jest najpierw programowo wykonać żądanie, a następnie załadować UIWebView z tego, o co prosiłeś. Załóżmy, że weźmiesz drugi przykład powyżej, gdzie masz NSString *page jako wynik wywołania do stringWithContentsOfURL:encoding:error:. Następnie możesz wcisnąć ten ciąg do widoku sieci Web za pomocą loadHTMLString:baseURL:, zakładając, że utrzymałeś również nsurl, o który prosiłeś:

[yourWebView loadHTMLString:page baseURL:requestURL];

Nie jestem pewien, jeśli jednak uruchomi to JavaScript znaleziony na ładowanej stronie (nazwa metody, loadHTMLString, jest nieco niejednoznaczna, a dokumenty nie mówią o tym zbyt wiele).

Więcej informacji:

 209
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 07:05:09

Jeśli chcesz rozpakować zawartość już załadowanego UIWebView, - stringByEvaluatingJavaScriptFromstring. Na przykład:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
 91
Author: Ben Gottlieb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 10:34:07

Aby uzyskać całe surowe dane HTML (z <head> i <body>):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
 41
Author: tuoxie007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-15 07:07:40

Zauważ, że NSString stringWithContentsOfURL zgłosi zupełnie inny ciąg agenta użytkownika niż UIWebView składający to samo żądanie. Jeśli więc twój serwer jest świadomy użytkownika i wysyła inny kod html w zależności od tego, kto o to prosi, możesz nie uzyskać poprawnych wyników w ten sposób.

Zauważ również, że @"document.body.innerHTML" wymienione 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. Która nadal nie jest kompletną treścią UIWebView, ponieważ nie wróci !doctype lub znaczniki html, ale jest o wiele bliżej.

 29
Author: Pmatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-07 03:15:19

Do przeczytania: -

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);    

Do modyfikacji: -

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
 19
Author: Agni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-22 17:32:02

(Xcode 5 iOS 7) Uniwersalny przykład aplikacji dla iOS 7 i Xcode 5. Jest to projekt / przykład open source znajdujący się tutaj: Link do SimpleWebView (przykład Zip projektu i kodu źródłowego)

 1
Author: Matthew Ferguson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 04:42:17

W Swift v3:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
 1
Author: Mc.Lover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 06:35:46

Używam takiego rozszerzenia swift:

extension UIWebView {
    var htmlContent:String? {
        return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
    }

}
 1
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 07:05:45

Powinieneś spróbować tego:

document.documentElement.outerHTML
 1
Author: schumyxp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-27 09:15:02