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
)?
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:
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"];
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"];
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.
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=''"];
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)
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")
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")
}
}
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
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