วิธีรับชื่อหน้า HTML ที่แสดงใน UIWebView


145

ฉันต้องการแยกเนื้อหาของแท็กชื่อจากหน้า HTML ที่แสดงใน UIWebView วิธีที่แข็งแกร่งที่สุดในการทำเช่นนั้นคืออะไร?

ฉันรู้ว่าฉันสามารถทำได้:

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

อย่างไรก็ตามจะใช้งานได้เฉพาะเมื่อเปิดใช้งานจาวาสคริปต์

อีกทางหนึ่งฉันสามารถสแกนข้อความของโค้ด HTML เพื่อดูชื่อ แต่รู้สึกยุ่งยากเล็กน้อยและอาจพิสูจน์ได้ว่าผู้เขียนหน้าเว็บสับสนกับรหัสของพวกเขา หากเป็นเช่นนั้นวิธีที่ดีที่สุดในการประมวลผลข้อความ html ภายใน iPhone API คืออะไร

ฉันรู้สึกว่าฉันลืมสิ่งที่ชัดเจน มีวิธีที่ดีกว่าสองตัวเลือกเหล่านี้หรือไม่?

ปรับปรุง:

ทำตามคำตอบของคำถามนี้: UIWebView: คุณสามารถปิดการใช้งาน Javascript ได้หรือไม่? ดูเหมือนจะไม่มีวิธีปิด Javascript ใน UIWebView ดังนั้นวิธีการ Javascript ข้างต้นจะทำงานได้เสมอ


1
+1 ฉันต้องหันไปใช้วิธี @ "document.title"
Dave DeLong

ฉันแค่ค้นหาสิ่งนี้และมีวิสัยทัศน์ที่น่ากลัวในการแยกวิเคราะห์ HTML ทางออกที่ฉลาดมาก
margusholland

ดูคำตอบต่อไปนี้สำหรับคำถาม SO ที่คล้ายกัน: stackoverflow.com/a/2313430/908621
fishinear

มีลิงค์มากมายในพอร์ทัลนี้เช่น: stackoverflow.com/questions/11704560/…หรือstackoverflow.com/questions/2301468/…
Kamil Wozniak

ชุมชนการสนับสนุนของ Apple มีคำตอบเดียวกัน
Daniel

คำตอบ:


88

สำหรับผู้ที่เพียงเลื่อนลงเพื่อค้นหาคำตอบ:

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

วิธีนี้จะทำงานได้เสมอเนื่องจากไม่มีวิธีปิด Javascript ใน UIWebView


ใช้สิ่งนี้หากการเข้ารหัสของหน้าเว็บไม่ใช่ 'utf-8' ชื่อจะยุ่งเหยิง
เซี่ยว

แล้ว Swift 4 ล่ะ?
Jayprakash Dubey

4

WKWebView มีคุณสมบัติ 'title' เพียงทำเช่นนี้

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

ฉันไม่คิดว่าUIWebViewมันเหมาะสมในตอนนี้


3

หากเปิดใช้งาน Javascript ให้ใช้สิ่งนี้: -

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

หาก Javascript Disabled ใช้สิ่งนี้: -

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

ฉันใช้ +7 และ -7 ใน NSMakeRange เพื่อกำจัดความยาวของ<title>ie 7


คุณสามารถปิดการใช้งาน Javascript ใน UIWebview ได้หรือไม่ ย้อนกลับไปในปี 2010 คุณทำไม่ได้
TechZen

ฉันไม่ทราบเกี่ยวกับ IOS ก่อนหน้า IOS 8 แต่คุณสามารถทำได้ไปที่การตั้งค่า -> Safari -> ขั้นสูง -> เปิด / ปิด Javascript
Pawandeep Singh

คุณจะรู้ได้อย่างไรว่ามีการเปิดใช้งานหรือปิดการใช้งานจาวาสคริปต์ในรหัสหรือไม่
Eddie

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 ตอนนี้เราจะได้ชื่ออย่างไร ทีนี้, ใน doc ทุกตัวที่ใช้ html ชื่อเรื่องจะถูกส่งสัญญาณโดย This Is the Title ดังนั้นสิ่งที่ง่ายที่สุดที่จะทำคือการค้นหาสตริง htmlCode สำหรับ, และ, และ, และ substring เพื่อให้เราได้สิ่งระหว่างนั้น

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

และนั่นมันจริงๆ! ดังนั้นโดยทั่วไปจะอธิบาย shenanigans ทั้งหมดที่เกิดขึ้นใน docTitle ถ้าเราทำช่วงเพียงแค่พูด NSMakeRange (startRange.location, endRange.location) เราจะได้รับชื่อและข้อความของ startString (ซึ่งเป็น) เพราะสถานที่เป็น อักขระตัวแรกของสตริง ดังนั้นเพื่อชดเชยนั่นเราเพิ่งบวกความยาวของสตริง

โปรดทราบว่ารหัสนี้ไม่ได้ทดสอบ .. หากมีปัญหาใด ๆ อาจเป็นข้อผิดพลาดในการสะกดคำหรือว่าฉันไม่ได้ / เพิ่มตัวชี้เมื่อฉันไม่ควร

หากชื่อเรื่องแปลกไปเล็กน้อยและไม่ถูกต้องลองทำดูรอบ ๆ กับ NSMakeRange - ฉันหมายถึงต้องการเพิ่ม / ลบความยาว / ตำแหน่งที่แตกต่างกันของสตริง - อะไรก็ตามที่ดูสมเหตุสมผล

หากคุณมีคำถามใด ๆ หรือมีปัญหาใด ๆ อย่าลังเลที่จะถาม นี่เป็นคำตอบแรกของฉันในเว็บไซต์นี้ดังนั้นขออภัยหากมีความสับสนเล็กน้อย


1

นี่คือรุ่น Swift 4 ตามคำตอบที่นี่

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

0

ฉันไม่มีประสบการณ์กับ webviews มาก่อน แต่ฉันเชื่อว่ามันตั้งชื่อเป็นชื่อหน้าดังนั้นเคล็ดลับที่ฉันแนะนำคือใช้หมวดหมู่บน webview และเขียนทับ setter สำหรับ self.title เพื่อให้คุณเพิ่มข้อความลงใน หนึ่งในนั้นคัดค้านหรือแก้ไขคุณสมบัติบางอย่างเพื่อให้ได้ชื่อ

คุณลองและบอกฉันได้ไหมว่ามันใช้ได้ไหม


0

หากคุณต้องการมันบ่อยในรหัสของคุณฉันขอแนะนำให้คุณเพิ่ม func ลงใน "ส่วนขยาย UIWebView" เช่นนี้

extension UIWebView {

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

หรือจะใช้ WKWebView ดีกว่า

น่าเสียดายที่มันไม่ได้รับการสนับสนุนใน ARKit ฉันต้องยอมแพ้กับ WKWebView ฉันไม่สามารถโหลดเว็บไซต์ใน webView ได้ หากใครบางคนมีทางออกสำหรับปัญหานี้ที่นี่ -> ฉันมีปัญหาเกี่ยวกับ simlar มันจะช่วยได้มาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.