Я хочу получить текст из списка веб-страниц. Я немного поэкспериментировал и обнаружил, что лучший способ удовлетворить мои потребности - использовать WebKit.
Как только источник страницы будет захвачен, я хочу удалить все HTML-теги, используя технику, описанную в этом комментарии.
Вот мой код:
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
if(frame == [sender mainFrame]) {
NSString *content = [[[[sender mainFrame] dataSource] representation] documentSource];
NSXMLDocument *theDocument = [[NSXMLDocument alloc] initWithXMLString:content options:NSXMLDocumentTidyHTML error:&theError];
NSString *theXSLTString = @"<?xml version='1.0' encoding='utf-8'?>\n<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xhtml='http://www.w3.org/1999/xhtml'>\n<xsl:output method='text'/>\n<xsl:template match='xhtml:head'></xsl:template>\n<xsl:template match='xhtml:script'></xsl:template>\n</xsl:stylesheet>";
NSData *theData = [theDocument objectByApplyingXSLTString:theXSLTString arguments:nil error:&theError];
NSString *theString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
}
}
Это прекрасно работает на большинстве страниц. Однако, если страница неверно проверяется как XHTML, я иногда получаю ошибку из моего initWithXMLString:
метода.
Это достаточно справедливо - я прошу привести в порядок XHTML, поэтому я ожидаю, что он сообщит, с какими проблемами он столкнулся. Но если есть проблема с проверкой, она возвращает ноль и ошибку, а не приводит в порядок XHTML.
Одной конкретной страницей, вызывающей проблему, является документация по классу Ruby.
Я обнаружил, что превосходное стороннее HTML приложение может очистить этот XHTML-файл нормально, но я ожидаю, что NSXMLDocumentTidyHTML сможет просто добавить некоторые кавычки вокруг значений cellpadding. Это довольно простая операция очистки. И я не стремлюсь добавить еще одну зависимость в мою базу кода.
Я что-то упускаю из-за того, как Какао очищает XHTML? Или мне просто нужно прикусить пулю и использовать вместо этого HTML Tidy в моем коде?