UIWebView에 표시되는 HTML 페이지의 제목을 얻는 방법?


145

UIWebView에 표시된 HTML 페이지에서 제목 태그의 내용을 추출해야합니다. 그렇게하는 가장 강력한 방법은 무엇입니까?

나는 내가 할 수 있다는 것을 안다.

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

그러나 자바 스크립트가 활성화 된 경우에만 작동합니다.

또는 제목에 대한 HTML 코드의 텍스트를 스캔 할 수 있지만 약간 번거롭고 페이지 작성자가 코드에 이상한 점이 있으면 깨지기 쉽습니다. 그렇다면 iPhone API 내에서 html 텍스트를 처리하는 데 가장 좋은 방법은 무엇입니까?

나는 분명한 것을 잊었다 고 생각합니다. 이 두 가지 선택보다 더 나은 방법이 있습니까?

최신 정보:

이 질문에 대한 답변에서 다음과 같습니다. UIWebView : Javascript를 비활성화 할 수 있습니까? UIWebView에서 Javascript를 끄는 방법이없는 것 같습니다. 따라서 위의 자바 스크립트 방법이 항상 작동합니다.


1
+1 또한 @ "document.title"메소드를 사용해야했습니다.
Dave DeLong

방금 이것을 찾고 있었고 HTML 파싱에 대한 무서운 비전이있었습니다. 매우 영리한 솔루션.
margusholland

비슷한 SO 질문에 대한 다음 답변도 참조하십시오. stackoverflow.com/a/2313430/908621
fishinear


Apple 지원 커뮤니티에도 같은 답변이 있습니다
Daniel

답변:


88

아래로 스크롤하여 답을 찾는 사람들을 위해 :

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

UIWebView에서 Javascript를 끄는 방법이 없으므로 항상 작동합니다.


이것을 사용하여 웹 페이지의 인코딩이 'utf-8'이 아닌 경우 제목이 지저분합니다.
Xiao

스위프트 4는 어떻습니까?
Jayprakash Dubey

4

WKWebView 'title'속성이 있습니다.

func webView(_ wv: WKWebView, didFinish navigation: WKNavigation!) {
    title = wv.title
}

UIWebView지금은 적당 하지 않다고 생각 합니다.


3

자바 스크립트가 활성화 된 경우 다음을 사용하십시오.

NSString *theTitle=[webViewstringByEvaluatingJavaScriptFromString:@"document.title"];

자바 스크립트가 비활성화 된 경우 다음을 사용하십시오.

NSString * htmlCode = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.appcoda.com"] encoding:NSASCIIStringEncoding error:nil];
NSString * start = @"<title>";
NSRange range1 = [htmlCode rangeOfString:start];

NSString * end = @"</title>";
NSRange range2 = [htmlCode rangeOfString:end];

NSString * subString = [htmlCode substringWithRange:NSMakeRange(range1.location + 7, range2.location - range1.location - 7)];
NSLog(@"substring is %@",subString);

나는 <title>7 의 길이를 제거하기 위해 NSMakeRange에서 +7과 -7을 사용했습니다.


UIWebview에서 Javascript를 비활성화 할 수 있습니까? 2010 년에는 불가능했습니다.
TechZen

IOS 8 이전의 IOS에 대해서는 잘 모르지만 설정으로 이동-> 사파리-> 고급-> 자바 스크립트 켜기 / 끄기
Pawandeep Singh

코드에서 자바 스크립트가 활성화 또는 비활성화되어 있는지 어떻게 알 수 있습니까?
Eddie

2

편집 : 당신이 답을 찾은 것을 보았습니다 ... sheeeiiitttt

나는 문자 그대로 이것을 배웠다! 이를 위해 UIWebView에 표시하지 않아도됩니다. (하지만 사용하면서 현재 페이지의 URL을 얻을 수 있습니다)

어쨌든, 여기에 코드와 (약한) 설명이 있습니다 :

    //create a URL which for the site you want to get the info from.. just replace google with whatever you want
    NSURL *currentURL = [NSURL URLWithString:@"http://www.google.com"];
    //for any exceptions/errors
    NSError *error;
    //converts the url html to a string
    NSString *htmlCode = [NSString stringWithContentsOfURL:currentURL encoding:NSASCIIStringEncoding error:&error];

HTML 코드가 있는데 제목을 어떻게 얻습니까? 글쎄, 모든 HTML 기반 문서에서 제목은 This Is the Title로 표시됩니다. 아마도 가장 쉬운 방법은 htmlCode 문자열을 for 및 for 및 하위 문자열로 검색하여 그 사이에 물건을 가져 오는 것입니다.

    //so let's create two strings that are our starting and ending signs
    NSString *startPoint = @"<title>";
    NSString *endPoint = @"</title>";
    //now in substringing in obj-c they're mostly based off of ranges, so we need to make some ranges
    NSRange startRange = [htmlCode rangeOfString:startPoint];
    NSRange endRange = [htmlCode rangeOfString:endPoint];
    //so what this is doing is it is finding the location in the html code and turning it
    //into two ints: the location and the length of the string
    //once we have this, we can do the substringing!
    //so just for easiness, let's make another string to have the title in
    NSString *docTitle = [htmlString substringWithRange:NSMakeRange(startRange.location + startRange.length, endRange.location)];
    NSLog(@"%@", docTitle);
    //just to print it out and see it's right

그게 다야! 기본적으로 docTitle에서 진행되는 모든 shenanigans를 설명하기 위해 NSMakeRange (startRange.location, endRange.location)라고 말하면 범위를 만들면 제목과 startString의 텍스트를 얻습니다. 문자열의 첫 문자 이를 오프셋하기 위해 문자열 길이를 추가했습니다.

이제이 코드는 테스트되지 않았다는 것을 명심하십시오. 문제가있을 경우 철자 오류 일 수도 있고, 예상치 않은 포인터를 추가하지 않았을 수도 있습니다.

제목이 조금 이상하고 완전히 옳지 않은 경우 NSMakeRange로 엉망이됩니다. 나는 문자열의 길이 / 위치가 다른 것을 더하거나 빼는 것처럼 논리적으로 보이는 것을 의미합니다.

궁금한 점이 있거나 문제가 있으면 언제든지 문의하십시오. 이 웹 사이트에 대한 첫 번째 답변이므로 약간 혼란 스럽다면 미안합니다.


1

여기에 답변을 기반으로 Swift 4 버전이 있습니다.

func webViewDidFinishLoad(_ webView: UIWebView) {
    let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}

0

나는 지금까지 웹뷰에 대한 경험이 없지만, 제목을 페이지 제목으로 설정한다고 생각합니다. 따라서 웹뷰에서 카테고리를 사용하고 self.title에 대한 세터를 덮어 써서 메시지를 추가하는 것이 좋습니다 당신 중 하나는 제목을 얻기 위해 일부 속성을 반대하거나 수정합니다.

작동하는지 알려주시겠습니까?


0

코드에서 자주 필요하면 다음과 같이 "확장 UIWebView"에 기능을 추가하는 것이 좋습니다.

extension UIWebView {

func title() -> String{
    let title: String = self.stringByEvaluatingJavaScript(from: "document.title")!
    return title
}

또는 WKWebView를 사용하는 것이 좋습니다.

불행히도 ARKit에서는 잘 지원되지 않습니다. WKWebView를 포기해야했습니다. 웹 사이트를 webView에로드 할 수 없었습니다. 누군가이 문제에 대한 해결책 이 여기에 있다면 -> 비슷한 문제가 있으면 크게 도움이 될 것입니다.

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