Làm cách nào để lấy tiêu đề của trang HTML được hiển thị trong UIWebView?


145

Tôi cần trích xuất nội dung của thẻ tiêu đề từ trang HTML được hiển thị trong UIWebView. Các phương tiện mạnh mẽ nhất để làm như vậy là gì?

Tôi biết tôi có thể làm:

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

Tuy nhiên, điều đó chỉ hoạt động nếu javascript được kích hoạt.

Ngoài ra, tôi chỉ có thể quét văn bản của mã HTML cho tiêu đề nhưng điều đó cảm thấy hơi cồng kềnh và có thể tỏ ra mong manh nếu các tác giả của trang trở nên kỳ quặc với mã của họ. Nếu nói đến đó, phương pháp tốt nhất để sử dụng để xử lý văn bản html trong API iPhone là gì?

Tôi cảm thấy rằng tôi đã quên một cái gì đó rõ ràng. Có một phương pháp tốt hơn hai lựa chọn này?

Cập nhật:

Theo dõi câu trả lời cho câu hỏi này: UIWebView: Bạn có thể tắt Javascript không? dường như không có cách nào để tắt Javascript trong UIWebView. Do đó phương pháp Javascript ở trên sẽ luôn hoạt động.


1
+1 Tôi cũng đã phải dùng đến phương pháp @ "document.title".
Dave DeLong

Tôi chỉ tìm kiếm cái này và có tầm nhìn đáng sợ khi phân tích cú pháp HTML. Giải pháp rất thông minh.
margusholland

Xem thêm câu trả lời sau cho câu hỏi SO tương tự: stackoverflow.com/a/2313430/908621
fishinear

Có rất nhiều liên kết trong cổng thông tin này, như: stackoverflow.com/questions/11704560/ , hoặc stackoverflow.com/questions/2301468/ Kẻ
Kamil Wozniak

Cộng đồng hỗ trợ của Apple cũng có câu trả lời tương tự
Daniel

Câu trả lời:


88

Đối với những người chỉ cần cuộn xuống để tìm câu trả lời:

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

Điều này sẽ luôn hoạt động vì không có cách nào để tắt Javascript trong UIWebView.


sử dụng điều này, nếu mã hóa của trang web không phải là 'utf-8', tiêu đề sẽ rất lộn xộn.
Xiao

Swift 4 thì sao?
Jayprakash Dubey

4

WKWebView có thuộc tính 'title', chỉ cần làm như thế này,

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

Tôi không nghĩ UIWebViewlà phù hợp ngay bây giờ.


3

Nếu Javascript được bật Sử dụng: -

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

Nếu Javascript bị vô hiệu hóa Sử dụng: -

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

Tôi đã sử dụng +7 và -7 trong NSMakeRange để loại bỏ độ dài <title>tức là 7


Bạn có thể tắt Javascript trong UIWebview ngay bây giờ không? Trở lại năm 2010, bạn không thể.
TechZen

Tôi không biết về iOS trước iOS 8 nhưng bạn có thể làm điều đó,
Truy

Làm thế nào để bạn biết nếu javascript được kích hoạt hoặc vô hiệu hóa trong mã?
Eddie

2

Chỉnh sửa: chỉ cần thấy bạn tìm ra câu trả lời ... sheeeiiitttt

Tôi thực sự chỉ học được điều này! Để làm điều này, bạn thậm chí không cần phải hiển thị nó trong UIWebView. (Nhưng khi bạn đang sử dụng nó, bạn chỉ có thể lấy URL của trang hiện tại)

Dù sao, đây là mã và một số giải thích (yếu):

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

Vì vậy, chúng tôi có mã HTML, bây giờ làm thế nào để chúng tôi có được tiêu đề? Chà, trong mọi tài liệu dựa trên html, tiêu đề được báo hiệu bởi Đây là Tiêu đề Vì vậy, có lẽ điều dễ nhất là tìm kiếm chuỗi htmlCode đó, và cho, và chuỗi con nó để chúng ta có được thứ ở giữa.

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

Và đó thực sự là nó! Vì vậy, về cơ bản để giải thích tất cả các shenanigans đang diễn ra trong docTitle, nếu chúng tôi tạo một phạm vi chỉ bằng cách nói NSMakeRange (startRange.location, endRange.location), chúng tôi sẽ nhận được tiêu đề VÀ văn bản của startString (đó là) bởi vì vị trí là bởi ký tự đầu tiên của chuỗi. Vì vậy, để bù lại, chúng tôi chỉ cần thêm độ dài của chuỗi

Bây giờ hãy nhớ rằng mã này không được kiểm tra .. nếu có bất kỳ vấn đề nào thì đó có thể là lỗi chính tả hoặc tôi đã không / đã thêm một con trỏ khi tôi không nên sử dụng.

Nếu tiêu đề hơi kỳ lạ và không hoàn toàn đúng, hãy thử làm rối tung với NSMakeRange-- Tôi có nghĩa là thêm / bớt các độ dài / vị trí khác nhau của chuỗi --- bất cứ điều gì có vẻ hợp lý.

Nếu bạn có bất kỳ câu hỏi hoặc có bất kỳ vấn đề, xin vui lòng hỏi. Đây là câu trả lời đầu tiên của tôi trên trang web này rất xin lỗi nếu nó hơi vô tổ chức


1

Đây là phiên bản Swift 4, dựa trên câu trả lời tại đây

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

0

Tôi chưa có kinh nghiệm với các lần xem web cho đến nay, nhưng tôi tin rằng nó đặt tiêu đề của nó cho tiêu đề trang, vì vậy, một mẹo tôi đề xuất là sử dụng một danh mục trên webview và ghi đè setter cho self.title để bạn thêm một thông điệp vào một trong các bạn phản đối hoặc sửa đổi một số tài sản để có được tiêu đề.

Bạn có thể thử và cho tôi biết nếu nó hoạt động?


0

Nếu bạn cần nó thường xuyên trong mã của mình, tôi khuyên bạn nên thêm một func vào "UIWebView mở rộng" như thế này

extension UIWebView {

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

cách khác tốt hơn là sử dụng WKWebView.

Thật không may, nó không được hỗ trợ tốt trong ARKit. Tôi đã phải từ bỏ trên WKWebView. Tôi không thể tải trang web vào webView. Nếu ai đó có giải pháp cho vấn đề này ở đây -> tôi có vấn đề về simlar, nó sẽ giúp ích rất nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.