web-dev-qa-db-ja.com

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

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

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

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

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

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

明らかなことを忘れてしまったように感じます。これらの2つの選択肢よりも良い方法はありますか?

更新:

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

143
TechZen

ちょうどスクロールダウンして答えを見つける人のために:

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

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

87
Brigham

WKWebViewには 'title'プロパティがあります。次のようにします。

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

UIWebViewは今のところ適切ではないと思います。

3
DawnSong

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を使用して、<title>の長さを削除しました。つまり、7

3
Pawandeep Singh

編集:答えを見つけたところを見た... 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)と言うだけで範囲を作成すると、場所と文字列の最初の文字。それを相殺するために、文字列の長さを追加しました

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

タイトルが少し変で完全に正しくない場合は、NSMakeRangeをいじってみてください。つまり、文字列の異なる長さ/場所を加算/減算することを意味します。

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

2
user3016226

Swift 4バージョン、 here の回答に基づきます)

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

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

動作するかどうか教えていただけますか?

0
RP Development

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

extension UIWebView {

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

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

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

0
MasterNaz