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

时间:2010-02-16 19:56:54

标签: ios objective-c iphone uiwebview foundation

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

我知道我能做到:

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

但是,只有在启用了javascript的情况下才有效。

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

我觉得我已经忘记了一些明显的东西。有没有比这两种选择更好的方法?

更新

在回答这个问题之后:UIWebView: Can You Disable Javascript?似乎没有办法在UIWebView中关闭Javascript。因此,上面的Javascript方法将始终有效。

7 个答案:

答案 0 :(得分:87)

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

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

这将始终有效,因为无法在UIWebView中关闭Javascript。

答案 1 :(得分: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来消除<title>的长度,即7

答案 2 :(得分:3)

WKWebView标题为&#39;财产,就这样做,

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

我认为UIWebView现在不合适。

答案 3 :(得分: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和fortring,以便我们得到它们之间的东西。

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

如果您有任何疑问或有任何问题,请随时提出。这是我在这个网站上的第一个答案,如果它有点混乱,那就很抱歉

答案 4 :(得分:1)

根据here

的回答,这是Swift 4版本
func webViewDidFinishLoad(_ webView: UIWebView) {
    let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}

答案 5 :(得分:0)

到目前为止,我还没有使用网页浏览量的经验,但我认为它设置了网页标题的标题,所以,我建议的一个技巧是在webview上使用一个类别并覆盖self.title的setter,这样你就添加了向你们中的一个人发送消息或修改某个属性以获得标题。

你可以尝试告诉我它是否有效吗?

答案 6 :(得分:0)

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

extension UIWebView {

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

或者更好地使用WKWebView。

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