UIWebView에서 HTML 내용 읽기


132

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

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

답변:


216

두 번째 질문은 실제로 대답하기가 더 쉽습니다. 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"];

그러면 Document Object Model을 사용하여 뷰의 현재 HTML 컨텐츠를 가져와 JavaScript를 구문 분석 한 다음 HTML의 NSString *로 제공합니다.

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

[yourWebView loadHTMLString:page baseURL:requestURL];

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

더 많은 정보를 위해서:


1
대박! 큰 답변 주셔서 감사합니다. 두 가지 방법으로 인해 페이지가 두 번로드되어 성능에 영향을 줄 수 있다고 가정합니다. 이를 피할 수있는 방법이 있습니까?
퍼지 퍼플 몽키

2
사실, 편집 된 답변이 있습니다.
Tim

1
예, [yourWebView loadHTMLString : page baseURL : requestURL]; 페이지에서 Javascript를 실행합니다. 이 API를 Google지도와 함께 사용했습니다.
jeff7091

3
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];몇 번이나 나를 위해 생명의 은인이되었습니다. 문서에서 가능한 한 많이 돌아 오는 것 같습니다.
ennalax

2
@Hanuman 다음이 도움이 될 수 있습니다. NSString * head = [yourWebView stringByEvaluatingJavaScriptFromString : @ "document.head.innerHTML"]; NSString * body = [yourWebView stringByEvaluatingJavaScriptFromString : @ "document.body.innerHTML"]; NSString * totalPage = 두 문자열을 모두 추가하십시오.
Deepukjayan 2016 년

91

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

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

10
젠장, 영리 해!
jemmons

2
내가 가진 질문은 내용이 JSON 문자열이거나 body 태그가없는 원시 문자열 인 경우 어떻게됩니까?
stephenmuss

이것은 건강한 해결책이 아닙니다! 이 방법으로 모든 자바 스크립트 코드 및 헤더 정보가 손실됩니다.
Radu Simionescu

43

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

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

29

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

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


이론적으로 서버에서 문서 유형을 요청하여 문서 유형을 얻을 있습니다. doctype은 useragent에 따라 변경되지 않을 수 있습니다.
Moshe

20

읽다:-

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

수정하려면 :-

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

2

스위프트 v3에서 :

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


1

나는 이와 같은 신속한 확장을 사용합니다 :

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

}

1

이것을 시도해야합니다 :

document.documentElement.outerHTML

1

UIWebView

UIWebView에서 HTML 가져 오기

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

HTML을 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
}

[WKWebView에서 HTML 가져 오기 / 설정]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.