Membaca konten HTML dari UIWebView

132

Apakah mungkin untuk membaca konten HTML mentah dari halaman web yang telah dimuat ke dalam UIWebView?

Jika tidak, apakah ada cara lain untuk menarik konten HTML mentah dari halaman web di iPhone SDK (seperti yang setara dengan .NET WebClient::openRead)?

Monyet Ungu kabur
sumber

Jawaban:

216

Pertanyaan kedua sebenarnya lebih mudah dijawab. Lihatlah stringWithContentsOfURL:encoding:error:metode NSString - ini memungkinkan Anda mengirimkan URL sebagai instance NSURL (yang dapat dengan mudah digunakan dari NSString) dan mengembalikan string dengan konten lengkap dari halaman di URL itu. Sebagai contoh:

NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL 
                                                encoding:NSASCIIStringEncoding
                                                   error:&error];

Setelah menjalankan kode ini, googlePageakan berisi HTML untuk www.google.com, dan errorakan mengandung kesalahan yang ditemukan dalam pengambilan. (Anda harus memeriksa konten errorsetelah pengambilan.)

Pergi ke arah lain (dari UIWebView) agak rumit, tetapi pada dasarnya konsep yang sama. Anda harus menarik permintaan dari tampilan, lalu lakukan pengambilan seperti sebelumnya:

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];

EDIT: Kedua metode ini mendapatkan performa yang baik, karena mereka melakukan permintaan dua kali. Anda dapat menyiasatinya dengan mengambil konten dari UIWebView yang saat ini dimuat menggunakan stringByEvaluatingJavascriptFromString:metodenya, seperti:

NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString: 
                                         @"document.body.innerHTML"];

Ini akan mengambil konten HTML saat ini dari tampilan menggunakan Model Objek Dokumen, parsing JavaScript, lalu berikan kepada Anda sebagai NSString * dari HTML.

Cara lain adalah dengan melakukan permintaan Anda secara terprogram terlebih dahulu, lalu muat UIWebView dari apa yang Anda minta. Katakanlah Anda mengambil contoh kedua di atas, di mana Anda memiliki NSString *pagehasil panggilan stringWithContentsOfURL:encoding:error:. Anda kemudian dapat mendorong string itu ke tampilan web menggunakan loadHTMLString:baseURL:, dengan asumsi Anda juga memegang NSURL yang Anda minta:

[yourWebView loadHTMLString:page baseURL:requestURL];

Saya tidak yakin, bagaimanapun, apakah ini akan menjalankan JavaScript yang ditemukan di halaman yang Anda muat (nama metode loadHTMLString,, agak ambigu, dan dokumen tidak banyak bicara tentang hal itu).

Untuk info lebih lanjut:

Tim
sumber
1
Luar biasa! Terima kasih atas jawabannya. Saya kira kedua metode menghasilkan halaman yang dimuat dua kali, yang mungkin memiliki dampak kinerja. Apakah ada cara untuk menghindarinya?
Fuzzy Purple Monkey
2
Sebagai soal fakta, ada :) Jawaban yang diedit.
Tim
1
Ya, [yourWebView loadHTMLString: basis lamanURL: requestURL]; akan menjalankan Javascript di halaman. Saya telah menggunakan api ini dengan Google maps.
jeff7091
3
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];telah menjadi penyelamat bagi saya beberapa kali sekarang. Tampaknya kembali dari dokumen sebanyak mungkin.
ennalax
2
@ Hanuman Ini mungkin membantu Anda: NSString * head = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.head.innerHTML"]; NSString * body = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.body.innerHTML"]; NSString * totalPage = tambahkan kedua string.
Deepukjayan
91

jika Anda ingin mengekstrak konten UIWebView yang sudah dimuat, -stringByEvaluatingJavaScriptFromString. Sebagai contoh:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
Ben Gottlieb
sumber
10
Sial, itu pintar!
jemmons
2
Pertanyaan saya adalah apa yang terjadi jika konten tersebut berupa string JSON atau bahkan string mentah tanpa tag tubuh?
stephenmuss
Ini bukan solusi yang sehat! Semua kode javascript dan info tajuk hilang dengan cara ini.
Radu Simionescu
43

Untuk mendapatkan seluruh data mentah HTML (dengan <head>dan <body>):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
tuoxie007
sumber
29

Perhatikan bahwa NSString stringWithContentsOfURL akan melaporkan string agen-pengguna yang sama sekali berbeda dari UIWebView yang membuat permintaan yang sama. Jadi jika server Anda mengetahui agen-pengguna, dan mengirim kembali html berbeda tergantung pada siapa yang memintanya, Anda mungkin tidak mendapatkan hasil yang benar dengan cara ini.

Perhatikan juga bahwa yang @"document.body.innerHTML"disebutkan di atas hanya akan menampilkan apa yang ada di tag tubuh. Jika Anda menggunakan, @"document.all[0].innerHTML"Anda akan mendapatkan kepala dan tubuh. Yang masih bukan isi lengkap dari UIWebView, karena tidak akan mendapatkan kembali tag! Doctype atau html, tetapi jauh lebih dekat.

Pmatt
sumber
Secara teoritis, Anda bisa mendapatkan DOCTYPE dengan memintanya dari server. Kemungkinan bahwa DOCTYPE tidak akan berubah berdasarkan agen pengguna.
Moshe
20

Untuk membaca:-

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);    

Untuk mengubah:-

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
Agni
sumber
2

Di Swift v3:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
Mc.Lover
sumber
1

Saya menggunakan ekstensi cepat seperti ini:

extension UIWebView {
    var htmlContent:String? {
        return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
    }

}
Nathan
sumber
1

Anda harus mencoba ini:

document.documentElement.outerHTML
schumyxp
sumber
1

UIWebView

dapatkan HTML dari UIWebView`

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

atur HTML ke UIWebView

//Do not forget to extend a class from `UIWebViewDelegate` and nil the delegate

func someFunction() {

    let uiWebView = UIWebView()
    uiWebView.loadHTMLString("<html><body></body></html>", baseURL: nil)
    uiWebView.delegate = self as? UIWebViewDelegate
}

func webViewDidFinishLoad(_ webView: UIWebView) {
    //ready to be processed
}

[dapatkan / atur HTML dari WKWebView]

yoAlex5
sumber