UIWebView में प्रदर्शित HTML पृष्ठ का शीर्षक कैसे प्राप्त करें?


145

मुझे UIWebView में प्रदर्शित HTML पृष्ठ से शीर्षक टैग की सामग्री को निकालने की आवश्यकता है। ऐसा करने का सबसे मजबूत साधन क्या है?

मुझे पता है मैं कर सकता हूँ:

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

हालाँकि, यह केवल तभी काम करता है जब जावास्क्रिप्ट सक्षम हो।

वैकल्पिक रूप से, मैं केवल शीर्षक के लिए HTML कोड के पाठ को स्कैन कर सकता हूं लेकिन यह थोड़ा बोझिल लगता है और यदि पृष्ठ के लेखक अपने कोड के साथ अजीब हो गए तो यह नाजुक साबित हो सकता है। यदि यह बात आती है कि, iPhone एपीआई के भीतर html पाठ को संसाधित करने के लिए सबसे अच्छा तरीका क्या है?

मुझे लगता है कि मैं कुछ स्पष्ट भूल गया हूं। क्या इन दो विकल्पों में से एक बेहतर तरीका है?

अपडेट करें:

इस प्रश्न के उत्तर से निम्नलिखित: UIWebView: क्या आप जावास्क्रिप्ट अक्षम कर सकते हैं? प्रतीत होता है कि UIWebView में जावास्क्रिप्ट को बंद करने का कोई तरीका नहीं है। इसलिए ऊपर जावास्क्रिप्ट विधि हमेशा काम करेगी।


1
+1 करने के लिए भी मुझे @ "document.title" विधि का सहारा लेना पड़ा।
डेव डोंगलांग

मैं बस इसके लिए खोज कर रहा था और HTML को पार्स करने के डरावने दृश्य थे। बहुत चालाक समाधान।
मारगुशोलैंड

इसी तरह के एक एसओ प्रश्न के निम्नलिखित उत्तर भी देखें: stackoverflow.com/a/2313430/908621
मछुआरे

इस पोर्टल में कई लिंक हैं, जैसे: stackoverflow.com/questions/11704560/… या stackoverflow.com/questions/2301468/…
Kamil Wozniak

Apple समर्थन समुदाय का भी यही उत्तर है
डैनियल

जवाबों:


88

उन लोगों के लिए जो बस उत्तर खोजने के लिए नीचे स्क्रॉल करते हैं:

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

यह हमेशा काम करेगा क्योंकि UIWebView में जावास्क्रिप्ट को बंद करने का कोई तरीका नहीं है।


इसका उपयोग करते हुए, यदि वेबपृष्ठ का एन्कोडिंग 'utf-8' नहीं है, तो शीर्षक गड़बड़ हो जाएगा।
जिओ

स्विफ्ट 4 के बारे में कैसे?
जयप्रकाश दुबे

4

WKWebView 'शीर्षक' संपत्ति है, बस इसे इस तरह से करें,

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

मुझे नहीं लगता कि UIWebViewअभी उपयुक्त है।


3

यदि जावास्क्रिप्ट सक्षम है तो इसका प्रयोग करें: -

NSString *theTitle=[webViewstringByEvaluatingJavaScriptFromString:@"document.title"];

यदि जावास्क्रिप्ट का उपयोग किया जाता है:

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 में जावास्क्रिप्ट अक्षम कर सकते हैं? 2010 में वापस आप नहीं कर सके।
टेकजेन

मैं IOS 8 से पहले IOS के बारे में नहीं जानता, लेकिन आप इसे कर सकते हैं, सेटिंग्स पर जाएं -> Safari -> उन्नत -> जावास्क्रिप्ट पर / बंद
पवनदीप सिंह

आपको पता है कि जावास्क्रिप्ट कोड में सक्षम या अक्षम है या नहीं?
एडी

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

और वास्तव में यह है! इसलिए मूल रूप से डॉकिटेल में चल रहे सभी शीनिगन्स को समझाने के लिए, अगर हमने सिर्फ NSMakeRange (startRange.location, endRange.location) कहकर एक सीमा बना दी तो हमें शीर्षक मिलेगा और स्टार्टरिंग का पाठ (जो है) क्योंकि स्थान इसके अनुसार है स्ट्रिंग का पहला चरित्र। ताकि ऑफसेट करने के लिए, हमने सिर्फ स्ट्रिंग की लंबाई जोड़ी

अब ध्यान रखें कि इस कोड का परीक्षण नहीं किया गया है .. अगर कोई समस्या है तो यह वर्तनी की त्रुटि हो सकती है, या जब मैंने ऐसा नहीं किया था, तो मैंने एक पॉइंटर नहीं जोड़ा था।

यदि शीर्षक थोड़ा अजीब है और पूरी तरह से सही नहीं है, तो NSMakeRange-- के साथ खिलवाड़ करने की कोशिश करें- मेरा मतलब है कि अलग-अलग लंबाई / स्ट्रिंग्स के स्थानों को जोड़ना / घटाना --- ऐसा कुछ जो तार्किक लगता हो।

यदि आपके कोई प्रश्न हैं या कोई समस्या है, तो बेझिझक पूछें। इस वेबसाइट पर यह मेरा पहला जवाब है, अगर यह थोड़ा अव्यवस्थित है तो क्षमा करें


1

यहाँ पर उत्तर के आधार पर यहाँ स्विफ्ट 4 संस्करण है

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

0

मुझे अब तक वेबवार्ता के साथ अनुभव नहीं है लेकिन, मेरा मानना ​​है कि यह पृष्ठ के शीर्षक में इट्स शीर्षक सेट करता है, इसलिए, मेरा सुझाव है कि वेबव्यू पर एक श्रेणी का उपयोग करें और सेल्फ के लिए सेटर को अधिलेखित करें ताकि आप एक संदेश जोड़ सकें शीर्षक पाने के लिए आप में से कोई एक वस्तु या कुछ संपत्ति को संशोधित करता है।

क्या आप कोशिश कर सकते हैं और मुझे बता सकते हैं कि क्या यह काम करता है?


0

यदि आपको अपने कोड में अक्सर इसकी आवश्यकता होती है, तो मैं आपको इस तरह "एक्सटेंशन UIWebView" में एक फंक जोड़ने का सुझाव देता हूं

extension UIWebView {

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

वैकल्पिक रूप से WKWebView का उपयोग करना बेहतर है।

दुर्भाग्य से, इसकी ARKit में अच्छी तरह से समर्थित नहीं है। मुझे WKWebView पर हार माननी पड़ी। मैं वेबवेब में वेबसाइट को लोड नहीं कर सका। अगर किसी के पास इस समस्या का हल है -> मुझे एक simlar समस्या है, तो यह बहुत मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.