#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 … не уверен, что следовать