UIWebView'da Görüntülenen Bir HTML Sayfasının Başlığını Nasıl Alabilirim?


146

UIWebView'da görüntülenen bir HTML sayfasından başlık etiketinin içeriğini çıkarmam gerekiyor. Bunu yapmanın en sağlam yolu nedir?

Yapabileceğimi biliyorum:

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

Ancak, bu yalnızca javascript etkinse çalışır.

Alternatif olarak, başlık için HTML kodunun metnini tarayabilirim, ancak bu biraz hantal geliyor ve sayfanın yazarları kodlarıyla çıldırırsa kırılgan olabilir. Buna gelirse, iPhone API içinde html metnini işlemek için kullanılacak en iyi yöntem nedir?

Apaçık bir şeyi unuttuğumu hissediyorum. Bu iki seçenekten daha iyi bir yöntem var mı?

Güncelleme:

Bu sorunun cevabından sonra: UIWebView: Javascript'i Devre Dışı Bırakabilir misiniz? UIWebView'da Javascript'i kapatmanın bir yolu yok gibi görünüyor. Bu nedenle yukarıdaki Javascript yöntemi her zaman işe yarayacaktır.


1
+1 Ayrıca @ "document.title" yöntemine de başvurmak zorunda kaldım.
Dave DeLong

Sadece bunu arıyordum ve HTML'yi ayrıştırmakla ilgili korkunç vizyonlar gördüm. Çok akıllıca bir çözüm.
margusholland

Benzer bir SO sorusuna verilen aşağıdaki yanıta da bakın: stackoverflow.com/a/2313430/908621
fishinear


Apple destek topluluğu da aynı cevaba sahip
Daniel

Yanıtlar:


88

Cevabı bulmak için aşağı kaydıranlar için:

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

UIWebView'da Javascript'i kapatmanın bir yolu olmadığı için bu her zaman çalışacaktır.


bunu kullanarak, web sayfasının kodlaması 'utf-8' değilse, başlık dağınık olacaktır.
Xiao

Swift 4'e ne dersin?
Jayprakash Dubey

4

WKWebView 'title' özelliğine sahip, sadece böyle yapın,

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

UIWebViewŞu anda uygun olduğunu düşünmüyorum .


3

Javascript Etkinse Bunu kullanın: -

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

Javascript Devre Dışı ise Bunu kullanın: -

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);

Ben +7 kullanılmış ve -7 NSMakeRange içinde uzunluğunu ortadan kaldırmak için <title>yani 7


UIWebview'de Javascript'i şimdi devre dışı bırakabilir misiniz? 2010'da yapamazdın.
TechZen

IOS 8'den önceki IOS hakkında bilgim yok ama bunu yapabilirsiniz, Ayarlar'a Git -> Safari -> Gelişmiş -> Javascript Açık / Kapalı
Pawandeep Singh

Kodda javascript'in etkin veya devre dışı olduğunu nasıl anlarsınız?
Eddie

2

Düzenleme: Az önce cevabı bulduğunuzu gördüm ... sheeeiiitttt

Kelimenin tam anlamıyla bunu öğrendim! Bunu yapmak için, UIWebView'da görüntülenmesine bile gerek yoktur. (Ama onu kullanırken, sadece mevcut sayfanın URL'sini alabilirsiniz)

Her neyse, işte kod ve bazı (zayıf) açıklamalar:

    //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];

Öyleyse HTML kodumuz var, şimdi başlığı nasıl alacağız? Eh, her html tabanlı dokümanda başlık, Bu Başlık ile belirtilir. Muhtemelen yapılacak en kolay şey, o htmlCode dizgesini, ve için aramak ve alt dize koymaktır, böylece aradaki maddeleri elde ederiz.

    //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

Ve bu gerçekten bu! Yani temel olarak docTitle'da devam eden tüm saçmalıkları açıklamak için, sadece NSMakeRange (startRange.location, endRange.location) diyerek bir aralık oluşturursak, başlığı VE startString'in metnini (yani) alırdık çünkü konum dizenin ilk karakteri. Bunu dengelemek için dizenin uzunluğunu ekledik

Şimdi, bu kodun test edilmediğini unutmayın .. herhangi bir sorun varsa, bu bir yazım hatası olabilir veya gerekmediğinde bir işaretçi eklemediğimi / eklemediğimi.

Başlık biraz tuhafsa ve tamamen doğru değilse, NSMakeRange ile uğraşmayı deneyin - yani dizelerin farklı uzunluklarını / konumlarını eklemek / çıkarmak gibi - mantıklı görünen herhangi bir şey.

Herhangi bir sorunuz varsa veya herhangi bir sorununuz varsa, sormaktan çekinmeyin. Bu web sitesindeki ilk cevabım, biraz dağınıksa özür dilerim


1

İşte Swift 4 versiyonu, buradaki cevaba göre

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

0

Şimdiye kadar web görüntülemeleri konusunda deneyimim yok, ancak bunun başlığını sayfa başlığına ayarladığına inanıyorum, bu yüzden önerdiğim bir numara, web görünümünde bir kategori kullanmak ve self.title için ayarlayıcının üzerine yazmak ve böylece bir mesaj eklemek. Başlığı almak için biriniz itiraz ediyor veya bazı özellikleri değiştiriyor.

Çalışıp çalışmadığını söyler misin bana?


0

Kodunuzda sık sık ihtiyacınız varsa, bunun gibi "UIWebView uzantısına" bir işlev eklemenizi öneririm

extension UIWebView {

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

alternatif olarak WKWebView kullanmak daha iyidir.

Ne yazık ki, ARKit'te iyi desteklenmiyor. WKWebView'dan vazgeçmek zorunda kaldım. Web sitesini webView'a yükleyemedim. Birisinin burada bu konuya bir çözümü varsa -> benzer bir sorunum var, çok yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.