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


145

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

我知道我可以做:

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

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

另外,我可以只扫描HTML代码的文本作为标题,但是这样感觉有点麻烦,并且如果页面的作者对其代码感到异常,可能会变得脆弱。如果涉及到这一点,那么在iPhone API中处理html文本的最佳方法是什么?

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

更新:

从该问题的答案中可以得出以下结论:UIWebView:是否可以禁用Javascript?在UIWebView中似乎无法关闭Javascript。因此,上面的Javascript方法将始终有效。


1
+1我还不得不诉诸@“ document.title”方法。
Dave DeLong 2010年

我只是在搜索此内容,并且对解析HTML有可怕的愿景。非常聪明的解决方案。
margusholland 2011年

另请参见以下类似SO问题的答案:stackoverflow.com/a/2313430/908621
fishinear 2013年


苹果支持社区也有同样的答案
Daniel

Answers:


88

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

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

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


使用此方法,如果网页的编码不是'utf-8',则标题将很混乱。

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来消除<title>即7 的长度


您现在可以在UIWebview中禁用Javascript吗?早在2010年,您做不到。
TechZen

我不知道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的文档中,标题都由“这就是标题”发出信号。因此,最简单的方法可能是在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的setter,以便向其中添加一条消息你们其中之一反对或修改某些属性以获取标题。

您能告诉我是否可行吗?


0

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

extension UIWebView {

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

或者最好使用WKWebView。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.