UIWebViewに表示されるHTMLページからタイトルタグのコンテンツを抽出する必要があります。そうするための最も堅牢な手段は何ですか?
私ができることを知っています:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
ただし、javascriptが有効になっている場合にのみ機能します。
別の方法として、タイトルのHTMLコードのテキストをスキャンすることもできますが、少し面倒な感じがし、ページの作成者がコードに異常を感じると壊れやすくなるかもしれません。それに関しては、iPhone API内でhtmlテキストを処理するのに最適な方法は何ですか?
明らかなことを忘れてしまったように感じます。これらの2つの選択肢よりも良い方法はありますか?
この質問への回答から: IWebView:Javascriptを無効にできますか? UIWebViewでJavaScriptをオフにする方法はないようです。したがって、上記のJavaScriptメソッドは常に機能します。
ちょうどスクロールダウンして答えを見つける人のために:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
UIWebViewでJavascriptをオフにする方法がないため、これは常に機能します。
WKWebView
には 'title'プロパティがあります。次のようにします。
func webView(_ wv: WKWebView, didFinish navigation: WKNavigation!) {
title = wv.title
}
UIWebView
は今のところ適切ではないと思います。
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
編集:答えを見つけたところを見た... 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をいじってみてください。つまり、文字列の異なる長さ/場所を加算/減算することを意味します。
ご質問がある場合や問題がある場合は、お気軽にお問い合わせください。これはこのウェブサイトでの最初の回答です。少し混乱しているとすみません
Swift 4バージョン、 here の回答に基づきます)
func webViewDidFinishLoad(_ webView: UIWebView) {
let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}
私はこれまでウェブビューの経験がありませんが、タイトルをページタイトルに設定すると信じているので、ウェブビューでカテゴリを使用し、self.titleのセッターを上書きしてメッセージを追加することをお勧めしますあなたの一人が反対するか、タイトルを取得するためにいくつかのプロパティを変更します。
動作するかどうか教えていただけますか?
コードで頻繁に必要な場合は、このように「拡張UIWebView」にfuncを追加することをお勧めします
extension UIWebView {
func title() -> String{
let title: String = self.stringByEvaluatingJavaScript(from: "document.title")!
return title
}
または、WKWebViewを使用することをお勧めします。
残念ながら、ARKitでは十分にサポートされていません。 WKWebViewをあきらめなければなりませんでした。 WebViewにWebサイトをロードできませんでした。誰かが この問題はこちら ->に解決策を持っているなら、私は同様の問題を抱えています、それは大いに役立ちます。