Wie wird der Titel einer HTML-Seite in UIWebView angezeigt?

145

Ich muss den Inhalt des Titel-Tags aus einer HTML-Seite extrahieren, die in einer UIWebView angezeigt wird. Was ist das robusteste Mittel dazu?

Ich weiß, dass ich tun kann:

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

Dies funktioniert jedoch nur, wenn Javascript aktiviert ist.

Alternativ könnte ich einfach den Text des HTML-Codes nach dem Titel durchsuchen, aber das fühlt sich etwas umständlich an und könnte sich als fragil erweisen, wenn die Autoren der Seite mit ihrem Code verrückt werden. Was ist die beste Methode, um den HTML-Text in der iPhone-API zu verarbeiten?

Ich habe das Gefühl, etwas Offensichtliches vergessen zu haben. Gibt es eine bessere Methode als diese beiden Möglichkeiten?

Aktualisieren:

Aus der Antwort auf diese Frage folgt: UIWebView: Können Sie Javascript deaktivieren? Es scheint keine Möglichkeit zu geben, Javascript in UIWebView zu deaktivieren. Daher funktioniert die oben beschriebene Javascript-Methode immer.

TechZen
quelle
1
+1 Ich musste auch auf die @ "document.title" -Methode zurückgreifen.
Dave DeLong
Ich habe nur danach gesucht und hatte beängstigende Visionen, den HTML-Code zu analysieren. Sehr clevere Lösung.
Margusholland
Siehe auch die folgende Antwort auf eine ähnliche SO-Frage: stackoverflow.com/a/2313430/908621
fishinear
Es gibt viele Links in diesem Portal, wie zum Beispiel: stackoverflow.com/questions/11704560/… oder stackoverflow.com/questions/2301468/…
Kamil Wozniak
Die Apple Support Community hat auch die gleiche Antwort
Daniel

Antworten:

88

Für diejenigen, die nur nach unten scrollen, um die Antwort zu finden:

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

Dies funktioniert immer, da Javascript in UIWebView nicht deaktiviert werden kann.

Brigham
quelle
Wenn die Codierung der Webseite nicht "utf-8" lautet, ist der Titel unordentlich.
Xiao
Wie wäre es mit Swift 4?
Jayprakash Dubey
4

WKWebView hat 'title' Eigenschaft, mach es einfach so,

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

Ich denke nicht, dass UIWebViewes momentan geeignet ist.

DawnSong
quelle
3

Wenn Javascript aktiviert ist Verwenden Sie Folgendes: -

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

Wenn Javascript deaktiviert ist Verwenden Sie Folgendes: -

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

Ich habe +7 und -7 in NSMakeRange verwendet, um die Länge von <title>dh 7 zu eliminieren

Pawandeep Singh
quelle
Können Sie Javascript jetzt in UIWebview deaktivieren? Im Jahr 2010 konnte man nicht.
TechZen
Ich weiß nicht über IOS vor IOS 8, aber Sie können es tun, gehen Sie zu Einstellungen -> Safari -> Erweitert -> Javascript Ein / Aus
Pawandeep Singh
Woher wissen Sie, ob Javascript im Code aktiviert oder deaktiviert ist?
Eddie
2

Edit: habe gerade gesehen, dass du die Antwort herausgefunden hast ... sheeeiiitttt

Ich habe das buchstäblich gerade gelernt! Dazu muss es nicht einmal in UIWebView angezeigt werden. (Aber während Sie es verwenden, können Sie einfach die URL der aktuellen Seite abrufen.)

Wie auch immer, hier ist der Code und einige (schwache) Erklärungen:

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

Wir haben also den HTML-Code. Wie bekommen wir nun den Titel? Nun, in jedem HTML-basierten Dokument wird der Titel durch This Is the Title signalisiert. Daher ist es wahrscheinlich am einfachsten, diesen HTMLCode-String nach und für und Teilzeichenfolgen zu durchsuchen, damit wir das Zeug dazwischen bekommen.

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

Und das war's auch schon! Um also alle im docTitle ablaufenden Spielereien zu erklären, würden wir, wenn wir einen Bereich nur mit NSMakeRange (startRange.location, endRange.location) erstellen würden, den Titel UND den Text von startString (was ist) erhalten, da der Speicherort von ist das erste Zeichen der Zeichenfolge. Um dies auszugleichen, haben wir nur die Länge der Zeichenfolge hinzugefügt

Denken Sie jetzt daran, dass dieser Code nicht getestet wird. Wenn es Probleme gibt, kann es sich um einen Rechtschreibfehler handeln oder darum, dass ich keinen Zeiger hinzugefügt habe, als ich es nicht sollte.

Wenn der Titel etwas seltsam und nicht ganz richtig ist, versuchen Sie, mit dem NSMakeRange herumzuspielen - ich meine, Sie möchten verschiedene Längen / Positionen der Zeichenfolgen addieren / subtrahieren - alles, was logisch erscheint.

Wenn Sie Fragen haben oder Probleme haben, können Sie diese gerne stellen. Dies ist meine erste Antwort auf dieser Website. Es tut mir leid, wenn sie etwas unorganisiert ist

user3016226
quelle
1

Hier ist die Swift 4-Version, basierend auf der Antwort hier

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

Ich habe bisher noch keine Erfahrung mit Webansichten, aber ich glaube, es setzt den Titel auf den Seitentitel. Ein Trick, den ich vorschlage, besteht darin, eine Kategorie in der Webansicht zu verwenden und den Setter für self.title zu überschreiben, damit Sie eine Nachricht hinzufügen Einer von Ihnen widerspricht oder ändert eine Eigenschaft, um den Titel zu erhalten.

Könnten Sie versuchen, mir zu sagen, ob es funktioniert?

RP-Entwicklung
quelle
0

Wenn Sie es häufig in Ihrem Code benötigen, empfehle ich Ihnen, der "Erweiterung UIWebView" wie folgt eine Funktion hinzuzufügen

extension UIWebView {

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

Alternativ ist es besser, WKWebView zu verwenden.

Leider wird es in ARKit nicht gut unterstützt. Ich musste WKWebView aufgeben. Ich konnte die Website nicht in die Webansicht laden. Wenn hier jemand eine Lösung für dieses Problem hat -> ich habe ein ähnliches Problem, würde es sehr helfen.

MasterNaz
quelle