Programing

UIWebView에서 HTML 내용 읽기

crosscheck 2020. 6. 29. 08:05
반응형

UIWebView에서 HTML 내용 읽기


에로드 된 웹 페이지의 원시 HTML 컨텐츠를 읽을 수 UIWebView있습니까?

그렇지 않은 경우 iPhone SDK의 웹 페이지에서 원시 HTML 컨텐츠를 가져 오는 다른 방법이 WebClient::openRead있습니까 (예 : .NET과 동일 )?


두 번째 질문은 실제로 대답하기가 더 쉽습니다. stringWithContentsOfURL:encoding:error:NSString 방법을 살펴보십시오. NSString (NSString에서 쉽게 인스턴스화 할 수 있음)의 인스턴스로 URL을 전달하고 해당 URL에서 페이지의 전체 내용이 포함 된 문자열을 반환합니다. 예를 들면 다음과 같습니다.

NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL 
                                                encoding:NSASCIIStringEncoding
                                                   error:&error];

이 코드를 실행하면 googlePagewww.google.com 용 HTML error이 포함되며 가져 오기에서 발생한 오류가 포함됩니다. ( error페치 후의 내용을 확인해야합니다 .)

UIWebView에서 다른 방법으로 이동하는 것은 조금 까다 롭지 만 기본적으로 동일한 개념입니다. 에서 요청을 가져온 다음 이전과 같이 가져 오기를 수행해야합니다.

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

편집 :이 두 가지 방법은 요청을 두 번 수행하기 때문에 성능이 저하됩니다. 다음 stringByEvaluatingJavascriptFromString:과 같이 메소드를 사용하여 현재로드 된 UIWebView에서 컨텐츠를 가져 와서이 문제를 해결할 수 있습니다 .

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

그러면 문서 개체 모델을 사용하여 뷰의 현재 HTML 내용을 가져 와서 JavaScript를 구문 분석 한 다음 HTML의 NSString *로 제공합니다.

다른 방법은 프로그래밍 방식으로 요청을 먼저 수행 한 다음 요청한 내용에서 UIWebView를로드하는 것입니다. NSString *page에 대한 호출의 결과 인 위의 두 번째 예를 가정 해 보겠습니다 stringWithContentsOfURL:encoding:error:. 그런 다음 loadHTMLString:baseURL:요청한 NSURL을 유지한다고 가정하고을 사용하여 해당 문자열을 웹보기로 푸시 할 수 있습니다 .

[yourWebView loadHTMLString:page baseURL:requestURL];

그러나 이것이로드 된 페이지에서 발견 된 JavaScript를 실행하면 확실하지 않습니다 (메서드 이름, loadHTMLString다소 모호하며 문서는 그것에 대해 많이 말하지 않습니다).

더 많은 정보를 위해서:


이미로드 된 UIWebView의 내용을 추출하려면 -stringByEvaluatingJavaScriptFromString입니다. 예를 들면 다음과 같습니다.

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

전체 HTML 원시 데이터를 가져 오려면 ( <head>및 포함 <body>) :

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];

NSString stringWithContentsOfURL은 동일한 요청을하는 UIWebView와는 완전히 다른 사용자 에이전트 문자열을보고합니다. 따라서 서버가 사용자 에이전트를 인식하고 누가 요청하는지에 따라 다른 HTML을 다시 보내는 경우 올바른 방법으로 결과를 얻지 못할 수 있습니다.

또한 @"document.body.innerHTML"위에서 언급 한 내용은 body 태그에있는 내용 만 표시합니다. 당신이 사용 @"document.all[0].innerHTML"하면 머리와 몸을 얻을 것이다. ! doctype 또는 html 태그를 다시 가져 오지 않지만 UIWebView의 완전한 내용은 아니지만 훨씬 더 가깝습니다.


읽다:-

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

수정하려면 :-

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

스위프트 v3에서 :

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")

(Xcode 5 iOS 7) Universal App example for iOS 7 and Xcode 5. It is an open source project / example located here: Link to SimpleWebView (Project Zip and Source Code Example)


I use a swift extension like this:

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

}

you should try this:

document.documentElement.outerHTML

One more example

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

get HTML from WKWebView
put HTML into UIWebView
put HTML into WKWebView

참고URL : https://stackoverflow.com/questions/992348/reading-html-content-from-a-uiwebview

반응형