เป็นไปได้ไหมที่จะอ่านเนื้อหา HTML ดิบของหน้าเว็บที่โหลดลงใน a UIWebView
?
หากไม่เป็นเช่นนั้นมีวิธีอื่นในการดึงเนื้อหา HTML ดิบจากหน้าเว็บใน iPhone SDK (เช่นไฟล์. NET WebClient::openRead
) หรือไม่
เป็นไปได้ไหมที่จะอ่านเนื้อหา HTML ดิบของหน้าเว็บที่โหลดลงใน a UIWebView
?
หากไม่เป็นเช่นนั้นมีวิธีอื่นในการดึงเนื้อหา HTML ดิบจากหน้าเว็บใน iPhone SDK (เช่นไฟล์. NET WebClient::openRead
) หรือไม่
คำตอบ:
คำถามที่สองตอบง่ายกว่า ดูstringWithContentsOfURL:encoding:error:
วิธีการของ NSString - ช่วยให้คุณส่ง URL เป็นอินสแตนซ์ของ NSURL (ซึ่งสามารถสร้างอินสแตนซ์จาก NSString ได้อย่างง่ายดาย) และส่งคืนสตริงที่มีเนื้อหาทั้งหมดของหน้าใน URL นั้น ตัวอย่างเช่น:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
หลังจากเรียกใช้โค้ดนี้แล้วgooglePage
จะมี HTML สำหรับ www.google.com และerror
จะมีข้อผิดพลาดที่พบในการดึงข้อมูล (คุณควรตรวจสอบเนื้อหาของerror
หลังจากการดึงข้อมูล)
ไปอีกทางหนึ่ง (จาก UIWebView) ค่อนข้างยุ่งยากกว่า แต่โดยพื้นฐานแล้วเป็นแนวคิดเดียวกัน คุณจะต้องดึงคำขอจากมุมมองจากนั้นทำการดึงข้อมูลเหมือนเดิม:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
แก้ไข:ทั้งสองวิธีนี้ได้รับผลกระทบด้านประสิทธิภาพเนื่องจากพวกเขาทำคำขอสองครั้ง คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการดึงเนื้อหาจาก UIWebView ที่โหลดในปัจจุบันโดยใช้stringByEvaluatingJavascriptFromString:
วิธีการดังต่อไปนี้:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
สิ่งนี้จะดึงเนื้อหา HTML ปัจจุบันของมุมมองโดยใช้ Document Object Model แยกวิเคราะห์ JavaScript จากนั้นให้เป็น NSString * ของ HTML
อีกวิธีหนึ่งคือทำตามคำขอของคุณโดยใช้โปรแกรมก่อนจากนั้นโหลด UIWebView จากสิ่งที่คุณร้องขอ สมมติว่าคุณใช้ตัวอย่างที่สองดังกล่าวข้างต้นที่คุณจะต้องเป็นผลมาจากการเรียกร้องให้มีNSString *page
stringWithContentsOfURL:encoding:error:
จากนั้นคุณสามารถพุชสตริงนั้นในมุมมองเว็บโดยใช้loadHTMLString:baseURL:
สมมติว่าคุณอยู่ใน NSURL ที่คุณร้องขอ:
[yourWebView loadHTMLString:page baseURL:requestURL];
อย่างไรก็ตามฉันไม่แน่ใจว่าจะเรียกใช้ JavaScript ที่พบในหน้าที่คุณโหลดได้หรือไม่ (ชื่อวิธีการloadHTMLString
ค่อนข้างคลุมเครือและเอกสารไม่ได้พูดถึงมันมากนัก)
สำหรับข้อมูลเพิ่มเติม:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
ช่วยชีวิตฉันมาหลายครั้งแล้ว ดูเหมือนว่าจะกลับมาจากเอกสารมากที่สุด
หากคุณต้องการแยกเนื้อหาของ UIWebView ที่โหลดไว้แล้ว -stringByEvaliftingJavaScriptFromString ตัวอย่างเช่น:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
ในการรับข้อมูลดิบ HTML ทั้งหมด (พร้อม<head>
และ<body>
):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
โปรดทราบว่า NSString stringWithContentsOfURL จะรายงานสตริง User-agent ที่แตกต่างจาก UIWebView ที่สร้างคำขอเดียวกัน ดังนั้นหากเซิร์ฟเวอร์ของคุณรับรู้ User-agent และส่งกลับ html ที่แตกต่างกันขึ้นอยู่กับว่าใครเป็นผู้ร้องขอคุณอาจไม่ได้รับผลลัพธ์ที่ถูกต้องด้วยวิธีนี้
โปรดทราบว่าสิ่งที่@"document.body.innerHTML"
กล่าวถึงข้างต้นจะแสดงเฉพาะสิ่งที่อยู่ในแท็กเนื้อหา หากคุณใช้@"document.all[0].innerHTML"
คุณจะได้รับทั้งศีรษะและลำตัว ซึ่งยังไม่ใช่เนื้อหาที่สมบูรณ์ของ UIWebView เนื่องจากจะไม่ได้รับแท็ก! Doctype หรือ html กลับคืนมา แต่มันใกล้กว่ามาก
อ่าน:-
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);
ในการปรับเปลี่ยน:-
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
ใน Swift v3:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
(Xcode 5 iOS 7) ตัวอย่าง Universal App สำหรับ iOS 7 และ Xcode 5 เป็นโครงการ / ตัวอย่างโอเพนซอร์สที่อยู่ที่นี่: ลิงก์ไปยัง SimpleWebView (ตัวอย่างรหัสไปรษณีย์และซอร์สโค้ด)
ฉันใช้ส่วนขยายที่รวดเร็วเช่นนี้:
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
คุณควรลองสิ่งนี้:
document.documentElement.outerHTML
รับ HTML จาก UIWebView`
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
ตั้งค่า HTML เป็น 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
}