UIWebViewに表示されるHTMLページのタイトルを取得する方法


145

UIWebViewに表示されたHTMLページからタイトルタグのコンテンツを抽出する必要があります。そうするための最も堅牢な手段は何ですか?

私はできることを知っています:

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

ただし、JavaScriptが有効になっている場合にのみ機能します。

または、タイトルのHTMLコードのテキストをスキャンすることもできますが、少し面倒で、ページの作成者がコードに慣れていないと壊れやすいかもしれません。それに関しては、iPhone API内でhtmlテキストを処理するために使用する最良の方法は何ですか?

明らかなことを忘れてしまったような気がします。これらの2つの選択肢よりも優れた方法はありますか?

更新:

この質問への回答から、UIWebView:JavaScriptを無効にできますか?UIWebViewでJavaScriptをオフにする方法がないようです。したがって、上記のJavaScriptメソッドは常に機能します。


1
+1また、@ "document.title"メソッドを使用する必要がありました。
Dave DeLong、2010

私はこれを探していて、HTMLを解析するという恐ろしいビジョンを持っていました。非常に賢いソリューション。
margusholland 2011

同様のSOの質問にも、以下の回答を参照してください。stackoverflow.com/a/2313430/908621を
fishinear

このポータルでは多くのリンクは次のようにあります:stackoverflow.com/questions/11704560/...またはstackoverflow.com/questions/2301468/...
カミルウォズニアック

アップルのサポートコミュニティにも同じ回答
ダニエル

回答:


88

下にスクロールして答えを見つけるだけの人:

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

UIWebViewでJavaScriptをオフにする方法がないため、これは常に機能します。


これを使用すると、Webページのエンコーディングが「utf-8」でない場合、タイトルが乱雑になります。
Xiao

Swift 4はどうですか?
Jayprakash Dubey

4

WKWebView 'title'プロパティがあります。このようにしてください。

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

UIWebView今は適当じゃないかな。


3

JavaScriptが有効な場合これを使用してください:-

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

JavaScriptが無効になっている場合これを使用してください:-

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);

NSMakeRangeで+7と-7を使用して、IE <title>7の長さを削除しました


UIWebviewでJavaScriptを無効にできますか?2010年にはできませんでした。
TechZen、2015年

IOS 8より前のIOSについては知りませんが、あなたはそれを行うことができます。設定に移動します->
Safari-

コードでJavaScriptが有効か無効かをどのようにして知るのですか?
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文字列を、、およびの部分文字列で検索して、その間にあるものを取得することです。

    //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で起こっているすべての悪意を説明するために、NSMakeRange(startRange.location、endRange.location)と言って範囲を作成した場合、場所とstartString(つまり)のテキストとタイトルが取得されます文字列の最初の文字。それを相殺するために、文字列の長さを追加しました

ここで、このコードはテストされていないことに注意してください。問題がある場合は、スペルエラーであるか、または想定していないときにポインターを追加しなかった、または追加しなかった可能性があります。

タイトルが少し奇妙で完全に正しくない場合は、NSMakeRangeをいじってみてください。つまり、文字列のさまざまな長さ/場所を足したり引いたりします。

ご不明な点や問題がございましたら、お気軽にお問い合わせください。これは私のこのウェブサイトでの最初の回答です。少し混乱しているとすみません


1

ここでの回答に基づいたSwift 4バージョンです

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

0

私はこれまでのところWebviewの経験はありませんが、タイトルをページタイトルに設定すると思います。そのため、WebViewのカテゴリを使用してself.titleのセッターを上書きし、メッセージを追加することをお勧めします。あなたの1人がタイトルを取得するためにいくつかのプロパティを変更または変更します

うまくいくかどうか教えてください。


0

あなたのコードでそれが頻繁に必要な場合は、このように「拡張UIWebView」にfuncを追加することをお勧めします

extension UIWebView {

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

または、WKWebViewを使用することをお勧めします。

残念ながら、ARKitでは十分にサポートされていません。私はWKWebViewをあきらめなければなりませんでした。WebViewにWebサイトをロードできませんでした。誰かがこの問題の解決策をここに持っている場合->私が同様の問題を抱えている場合、それは非常に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.