ios 如何获取 UIWebView 中显示的 HTML 页面的标题?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2275876/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to Get the Title of a HTML Page Displayed in UIWebView?
提问by TechZen
I need to extract the contents of the title tag from an HTML page displayed in a UIWebView. What is the most robust means of doing so?
我需要从 UIWebView 中显示的 HTML 页面中提取标题标记的内容。这样做的最可靠方法是什么?
I know I can do:
我知道我可以做到:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
However, that only works if javascript is enabled.
但是,这仅在启用 javascript 时才有效。
Alternatively, I could just scan the text of the HTML code for the title but that feels a bit cumbersome and might prove fragile if the page's authors got freaky with their code. If it comes to that, what's the best method to use for processing the html text within the iPhone API?
或者,我可以只扫描标题的 HTML 代码文本,但这感觉有点麻烦,而且如果页面的作者对他们的代码感到奇怪,可能会证明它很脆弱。如果涉及到这一点,在 iPhone API 中处理 html 文本的最佳方法是什么?
I feel that I've forgotten something obvious. Is there a better method than these two choices?
我觉得我忘记了一些明显的事情。还有比这两种选择更好的方法吗?
Update:
更新:
Following from the answer to this question: UIWebView: Can You Disable Javascript?there appears to be no way to turn off Javascript in UIWebView. Therefore the Javascript method above will always work.
以下是对这个问题的回答:UIWebView: Can You Disable Javascript? 似乎无法在 UIWebView 中关闭 Javascript。因此,上面的 Javascript 方法将始终有效。
回答by Brigham
For those who just scroll down to find the answer:
对于那些只是向下滚动以找到答案的人:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
This will always work as there is no way to turn off Javascript in UIWebView.
这将始终有效,因为无法在 UIWebView 中关闭 Javascript。
回答by DawnSong
WKWebView
has 'title' property, just do it like this,
WKWebView
有'title'属性,就这样做,
func webView(_ wv: WKWebView, didFinish navigation: WKNavigation!) {
title = wv.title
}
I don't think UIWebView
is suitable right now.
我认为UIWebView
现在不合适。
回答by Pawandeep Singh
If Javascript Enabled Use this :-
如果启用了 Javascript 使用这个:-
NSString *theTitle=[webViewstringByEvaluatingJavaScriptFromString:@"document.title"];
If Javascript Disabled Use this :-
如果禁用 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);
I Used +7 and -7 in NSMakeRange to eliminate the length of <title>
i.e 7
我在 NSMakeRange 中使用了 +7 和 -7 来消除<title>
ie 7的长度
回答by user3016226
Edit: just saw you found out the answer... sheeeiiitttt
编辑:刚刚看到你找到了答案...... sheeeiiitttt
I literally just learned this! To do this, you don't even need to have it displayed in UIWebView. (But as you are using it, you can just get the URL of the current page)
我真的刚刚学会了这个!为此,您甚至不需要在 UIWebView 中显示它。(但是在使用的过程中,只能获取当前页面的URL)
Anyways, here's the code and some (feeble) explanation:
无论如何,这是代码和一些(无力的)解释:
//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];
So we have the HTML code, now how do we get the title? Well, in every html-based doc the title is signaled by This Is the Title So probably the easiest thing to do is to search that htmlCode string for , and for , and substring it so we get the stuff in between.
所以我们有了 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
And that's really it! So basically to explain all the shenanigans going on in the docTitle, if we made a range just by saying NSMakeRange(startRange.location, endRange.location) we would get the title AND the text of startString (which is ) because the location is by the first character of the string. So in order to offset that, we just added the length of the string
就是这样!所以基本上是为了解释 docTitle 中发生的所有恶作剧,如果我们仅仅通过说 NSMakeRange(startRange.location, endRange.location) 来创建一个范围,我们将获得标题和 startString 的文本(即 ),因为位置是字符串的第一个字符。所以为了抵消它,我们只是添加了字符串的长度
Now keep in mind this code is not tested.. if there are any problems it might be a spelling error, or that I didn't/did add a pointer when i wasn't supposed to.
现在请记住,此代码未经测试.. 如果有任何问题,则可能是拼写错误,或者我没有/确实添加了不应该添加的指针。
If the title is a little weird and not completely right, try messing around with the NSMakeRange-- I mean like add/subtract different lengths/locations of the strings --- anything that seems logical.
如果标题有点奇怪并且不完全正确,请尝试使用 NSMakeRange - 我的意思是添加/减去字符串的不同长度/位置 - 任何看起来合乎逻辑的东西。
If you have any questions or there are any problems, feel free to ask. This my first answer on this website so sorry if it's a little disorganized
如果您有任何疑问或有任何问题,请随时提问。这是我在这个网站上的第一个答案,如果它有点混乱,很抱歉
回答by Nizzam
回答by MasterNaz
If you need it frequently in your code, i suggest you to add a func into "extension UIWebView" like this
如果您在代码中经常需要它,我建议您像这样在“扩展 UIWebView”中添加一个 func
extension UIWebView {
func title() -> String{
let title: String = self.stringByEvaluatingJavaScript(from: "document.title")!
return title
}
alternatively its better to use WKWebView.
或者最好使用 WKWebView。
Unfortunately, its not well supported in ARKit. I had to give up on WKWebView. I couldnt load the website into the webView. If someone has a solution to this issue here-> i have a simlar problem, it would help greatly.
不幸的是,它在 ARKit 中并没有得到很好的支持。我不得不放弃 WKWebView。我无法将网站加载到 webView 中。如果有人在这里有解决此问题的方法-> 我有一个类似的问题,这将有很大帮助。
回答by RP Development
I dońt have experience with webviews so far but, i believe it sets it′s title to the page title, so, a trick I suggest is to use a category on webview and overwrite the setter for self.title so you add a message to one of you object or modify some property to get the title.
到目前为止,我还没有使用 webviews 的经验,但是,我相信它将它的标题设置为页面标题,因此,我建议的一个技巧是在 webview 上使用一个类别并覆盖 self.title 的设置器,以便您向其中添加一条消息你们中的一个人反对或修改某些属性以获得标题。
Could you try and tell me if it works?
你能试着告诉我它是否有效吗?