iOS — самый быстрый способ получить все в строке html?

#iphone #html #pattern-matching #image

#iPhone #HTML #сопоставление с образцом #изображение

Вопрос:

У меня есть много строк HTML (новости из Google Reader) для обработки. В основном, что мне нужно сделать, это получить все теги img из HTMLS.

Кто-нибудь может подсказать мне наиболее эффективный способ сделать это?

Спасибо

Кроме того, что делать, если мне нужно получить все теги, а также

теги? Есть ли самый быстрый способ получить оба или даже больше тегов за один запуск?

Спасибо

Ответ №1:

Предполагая, что строки HTML на самом деле являются допустимым XML (т. Е. Они на самом деле XHTML), тогда вам следует рассмотреть возможность использования XPath для сопоставления всех элементов имени «IMG». Я использовал различные библиотеки C в приложении iOS для успешного выполнения подобных задач.

Комментарии:

1. Однако это довольно большое предположение для случайных элементов RSS.

2. Правда — это идея, которая будет работать только для страниц XHTML, и это делает ее ограниченной.

3. Чтобы уточнить, это все еще может быть лучшим методом. Это зависит от вашего синтаксического анализатора XML и от того, насколько хорошо он анализирует хорошо сформированный или искаженный HTML.

4. @cobbal, спасибо. но я не могу предположить, что на самом деле многие HTML’ы из элементов RSS не являются строго допустимым HTML. Кроме того, если я создам документ XHTML, это будет намного медленнее, чем сканирование чистой строки.

Ответ №2:

Другой подход, который можно попробовать, — использовать экземпляры NSScanner. Предполагая, что у вас есть ваша HTML-строка в NSString с именем HtmlString, вы можете попробовать что-то вроде этого:

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

Ответ №3:

Попробуйте libtidy NSXMLParser:

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

Из документа NSXMLDocumentTidyHTML : Форматирует HTML в допустимый XHTML во время обработки документа.

Если это не сработает, вы можете попробовать загрузить исходный код HTML в UIWebView и использовать javascript для доступа к DOM.

Комментарии:

1. Привет, на самом деле это то, что я делаю, сначала приведите его в порядок, а затем проанализируйте. но это происходит очень медленно. Это стоит почти 0,5 — 0,9 секунды только для ОДНОГО элемента rss (длина HTML составляет примерно 2 КБ — 10 КБ). Если я сделаю это для 50 элементов, это займет около 1 минуты.

2. Вы спрашивали о строке HTML. RSS не является строкой HTML. Вы проверяли анализаторы objective-c RSS? Чем конкретнее, тем быстрее, я думаю.

3. NSXMLDocument недоступен на iOS … не уверен, что следовать