iOS - de snelste manier om alle <img> in een html-string op te halen?

Ik heb veel HTML-strings (nieuwsitems van Google Reader) om te verwerken. Wat ik vooral moet doen, is alle img-tags van de HTML's ophalen.

Kan iemand me een meest efficiënte manier vertellen om dat te doen?

Bedankt

Ook, wat als ik alle tags ook moet ophalen

labels? De snelste manier om beide of zelfs meerdere tags in één run op te halen?

Bedankt

1

3 antwoord

Ervan uitgaande dat de HTML-reeksen daadwerkelijk geldige xml zijn (dat wil zeggen ze zijn eigenlijk XHTML), dan zou je moeten overwegen om XPath te gebruiken om alle elementen van de naam "IMG" te matchen. Ik heb verschillende C-bibliotheken in een iOS-applicatie gebruikt om dit soort dingen met succes te doen.

2
toegevoegd
@cobbal, bedankt. maar ik kan niet aannemen dat in feite veel HTML's van RSS-items geen strikt geldige HTML zijn. Als ik een XHTML-document maak, is het ook veel langzamer dan pure tekenreeks scannen.
toegevoegd de auteur Jackson Tale, de bron
Dat is een vrij grote veronderstelling om voor willekeurige RSS-items te maken.
toegevoegd de auteur cobbal, de bron
Om te verduidelijken, dit kan nog steeds de beste methode zijn. Het hangt af van je XML-parser en hoe goed hij goed geformuleerde of verkeerd ingedeelde HTML parseert.
toegevoegd de auteur cobbal, de bron
Waar - het is een idee dat alleen voor XHTML-pagina's zou werken en dat het beperkt maakt.
toegevoegd de auteur Tim Dean, de bron

Een andere benadering om te proberen zou zijn om NSScanner-instanties te gebruiken. Ervan uitgaande dat u uw HTML-string in een NSString genaamd htmlString heeft, kunt u zoiets als dit proberen:

NSScanner *scanner = [NSScanner scannerWithString:htmlString];
while ([scanner scanUpToString:@"" intoString &tagContents]) {
       //Do something with tag contents
    }
    else {
       //Do nothing? I think this would be hit on the last time through the loop
    }
}
2
toegevoegd

Probeer libtidy + NSXMLParser:

 doc = [[NSXMLDocument alloc] 
           initWithContentsOfURL:url
                         options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA)
                           error:&err];
 if (!doc) {
     doc = [[NSXMLDocument alloc] 
           initWithContentsOfURL:url
                         options:NSXMLDocumentTidyHTML
                           error:&err];
 }

From the doc, NSXMLDocumentTidyHTML: Formats HTML into valid XHTML during processing of the document.

Als dit niet werkt, kunt u proberen de HTML-bron in een UIWebView te laden en JavaScript te gebruiken om toegang te krijgen tot de DOM.

1
toegevoegd
Hallo, dit is eigenlijk wat ik aan het doen ben, het eerst opruimen en het dan ontleden. maar het is erg langzaam. Het kost bijna 0,5 - 0,9 sec voor slechts één rss-item (de lengte van de HTML is ongeveer 2KB - 10 KB). Als ik dit voor 50 items doe, duurt het ongeveer 1 minuut.
toegevoegd de auteur Jackson Tale, de bron
U vroeg naar de HTML-reeks. RSS is geen HTML-tekenreeks. Heb je object-c RSS-parsers gecontroleerd? Hoe specifieker, hoe sneller, denk ik.
toegevoegd de auteur djromero, de bron
NSXMLDocument is niet beschikbaar op iOS ... niet zeker om te volgen
toegevoegd de auteur malaba, de bron