如何获取在 UIWebView 中显示的 HTML 页面的标题?

我需要从 UIWebView 中显示的 HTML 页面中提取 title 标签的内容。这样做的最有力手段是什么?

我知道我能做到:

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

但是,这只有在启用了 javascript 时才有效。

或者,我可以只扫描标题的 HTML 代码文本,但感觉有点麻烦,如果页面的作者对他们的代码感到奇怪,可能会证明是脆弱的。如果需要,在 iPhone API 中处理 html 文本的最佳方法是什么?

我觉得我忘记了一些显而易见的事情。还有比这两个选择更好的方法吗?

更新:

以下是对这个问题的回答: 在 UIWebView 中,似乎没有办法关闭 Javascript。因此,上面的 Javascript 方法将始终工作。

41281 次浏览

对于那些只是向下滚动寻找答案的人来说:

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

这将始终工作,因为没有办法在 UIWebView 中关闭 Javascript。

到目前为止,我还没有使用 webview 的经验,但是,我相信它可以将标题设置为页面标题,所以,我建议的一个技巧是在 webview 上使用一个类别,覆盖 self. title 的 setter,这样你就可以向你的一个对象添加一条消息,或者修改一些属性来获得标题。

你能试着告诉我它是否有用吗?

编辑: 刚看到你找到了答案... sheeeilittt

我才刚学会这个!要做到这一点,您甚至不需要在 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,and substring 这样我们就可以得到它们之间的内容了。

    //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 ——我的意思是像添加/减去字符串的不同长度/位置——任何看起来合乎逻辑的东西。

如果你有任何问题或者有任何问题,尽管问。这是我在这个网站上的第一个回答,如果有点杂乱无章,我很抱歉

如果启用了 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

WKWebView有“ title”属性,就像这样做,

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

我认为 UIWebView现在不适合。

这里是 Swift 4的版本,基于 给你的答案

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

如果你在代码中经常需要它,我建议你像这样在“扩展 UIWebView”中添加一个 func

extension UIWebView {


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

或者最好使用 WKWebView。

不幸的是,它在 ARKit 中没有得到很好的支持。我不得不放弃 WKWebView。我无法将网站加载到 webView 中。如果有人有一个解决 这个问题-> 我有一个类似的问题,这将有很大的帮助。