Bagaimana Cara Mendapatkan Judul Halaman HTML yang Ditampilkan di UIWebView?


145

Saya perlu mengekstraksi konten tag judul dari halaman HTML yang ditampilkan di UIWebView. Apa cara paling kuat untuk melakukannya?

Saya tahu saya bisa melakukannya:

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

Namun, itu hanya berfungsi jika javascript diaktifkan.

Atau, saya hanya bisa memindai teks dari kode HTML untuk judul tetapi rasanya agak rumit dan mungkin terbukti rapuh jika penulis halaman menjadi aneh dengan kode mereka. Jika itu yang terjadi, apa metode terbaik untuk digunakan untuk memproses teks html dalam iPhone API?

Saya merasa bahwa saya lupa sesuatu yang jelas. Apakah ada metode yang lebih baik daripada dua pilihan ini?

Memperbarui:

Berikut dari jawaban untuk pertanyaan ini: UIWebView: Dapatkah Anda Menonaktifkan Javascript? tampaknya tidak ada cara untuk mematikan Javascript di UIWebView. Karenanya metode Javascript di atas akan selalu berfungsi.


1
+1 Saya juga harus menggunakan metode @ "document.title".
Dave DeLong

Saya baru saja mencari ini dan memiliki visi menakutkan tentang penguraian HTML. Solusi yang sangat pintar.
margusholland

Lihat juga jawaban berikut untuk pertanyaan SO yang serupa: stackoverflow.com/a/2313430/908621
fishinear


Komunitas pendukung Apple juga memiliki jawaban yang sama
Daniel

Jawaban:


88

Bagi yang baru saja gulir ke bawah untuk menemukan jawabannya:

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

Ini akan selalu berfungsi karena tidak ada cara untuk mematikan Javascript di UIWebView.


menggunakan ini, jika pengkodean halaman web bukan 'utf-8', judulnya akan berantakan.
Xiao

Bagaimana dengan Swift 4?
Jayprakash Dubey

4

WKWebView memiliki properti 'judul', lakukan saja seperti ini,

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

Saya pikir UIWebViewini tidak cocok untuk saat ini.


3

Jika Javascript Diaktifkan Gunakan ini: -

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

Jika Javascript Dinonaktifkan Gunakan ini: -

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

Saya Menggunakan +7 dan -7 di NSMakeRange untuk menghilangkan panjang <title>yaitu 7


Bisakah Anda menonaktifkan Javascript di UIWebview sekarang? Kembali pada 2010 Anda tidak bisa.
TechZen

Saya tidak tahu tentang iOS sebelum iOS 8 tetapi Anda dapat melakukannya, Buka Pengaturan -> Safari -> Lanjutan -> Javascript Nyala / Mati
Pawandeep Singh

Bagaimana Anda tahu jika javascript diaktifkan atau dinonaktifkan dalam kode?
Eddie

2

Sunting: baru saja melihat Anda menemukan jawabannya ... sheeeiiitttt

Saya benar-benar baru saja mempelajari ini! Untuk melakukan ini, Anda bahkan tidak perlu membuatnya ditampilkan di UIWebView. (Tapi saat Anda menggunakannya, Anda bisa mendapatkan URL halaman saat ini)

Bagaimanapun, inilah kode dan beberapa penjelasan (lemah):

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

Jadi kita memiliki kode HTML, sekarang bagaimana cara mendapatkan judulnya? Nah, di setiap dokumen berbasis html, judulnya ditandai oleh This is the Title Jadi mungkin yang paling mudah untuk dilakukan adalah mencari string htmlCode untuk, dan untuk, dan menyubstratkannya sehingga kami mendapatkan barang di antaranya.

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

Dan itu benar-benar itu! Jadi pada dasarnya untuk menjelaskan semua gangguan yang terjadi di docTitle, jika kita membuat rentang hanya dengan mengatakan NSMakeRange (startRange.location, endRange.location) kita akan mendapatkan judul DAN teks startString (yang) karena lokasinya oleh karakter pertama dari string. Jadi untuk mengimbangi itu, kami hanya menambahkan panjang string

Sekarang perlu diingat kode ini tidak diuji .. jika ada masalah itu mungkin kesalahan ejaan, atau bahwa saya tidak / tidak menambahkan pointer ketika saya tidak seharusnya.

Jika judulnya sedikit aneh dan tidak sepenuhnya benar, coba main-main dengan NSMakeRange - maksud saya seperti menambah / mengurangi panjang / lokasi string yang berbeda --- apa pun yang tampak logis.

Jika Anda memiliki pertanyaan atau ada masalah, jangan ragu untuk bertanya. Ini jawaban pertama saya di situs web ini. Maaf jika sedikit tidak teratur


1

Berikut adalah versi Swift 4, berdasarkan jawaban di sini

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

0

Saya tidak memiliki pengalaman dengan tampilan web sejauh ini tetapi, saya percaya itu menetapkan judulnya ke judul halaman, jadi, trik yang saya sarankan adalah menggunakan kategori pada tampilan web dan menimpa setter untuk self.title sehingga Anda menambahkan pesan ke salah satu dari Anda keberatan atau memodifikasi beberapa properti untuk mendapatkan judul.

Bisakah Anda mencoba dan memberi tahu saya jika itu berhasil?


0

Jika Anda sering membutuhkannya dalam kode Anda, saya sarankan Anda untuk menambahkan func ke "ekstensi UIWebView" seperti ini

extension UIWebView {

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

atau lebih baik menggunakan WKWebView.

Sayangnya, itu tidak didukung dengan baik di ARKit. Saya harus menyerah di WKWebView. Saya tidak bisa memuat situs web ke webView. Jika seseorang memiliki solusi untuk masalah ini di sini -> saya memiliki masalah yang sama, itu akan sangat membantu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.