parsowanie HTML na iPhonie [zamknięte]
Czy ktoś może polecić bibliotekę C lub Objective - C do parsowania HTML? Musi obsługiwać niechlujny kod HTML, który nie będzie do końca poprawny.
Czy taka biblioteka istnieje, czy lepiej mi po prostu używać wyrażeń regularnych?
9 answers
Okazało się, że użycie hpple jest całkiem przydatne do analizy niechlujnego HTML. Hpple project to Objective-C w bibliotece xpathquery do przetwarzania HTML. Za jego pomocą możesz wysłać zapytanie XPath i otrzymać wynik .
Wymagania :
- Dodaj libxml2 includes do swojego projektu
- Menu Projekt - > Edytuj Ustawienia Projektu
- wyszukaj ustawienie "ścieżki wyszukiwania nagłówka"
- Dodaj nową ścieżkę wyszukiwania "${SDKROOT} / usr / include / libxml2 "
- Enable opcja rekurencyjna
- Dodaj bibliotekę libxml2 do swojego projektu
- Menu Projekt - > Edytuj Ustawienia Projektu
- wyszukaj ustawienie "inne flagi linkera"
- Dodaj nową flagę wyszukiwania "- lxml2 "
- From hpple get the following source code files and add them to your projekt:
- TFpple.h
- TFpple.m
- TFppleElement.h
- TFppleElement.m
- XPathQuery.h
- XPathQuery.m
- Wybierz się na spacer po W3School XPath Tutorial aby poczuć się komfortowo z językiem XPath.
Przykład Kodu
#import "TFHpple.h"
NSData *data = [[NSData alloc] initWithContentsOfFile:@"example.html"];
// Create parser
xpathParser = [[TFHpple alloc] initWithHTMLData:data];
//Get all the cells of the 2nd row of the 3rd table
NSArray *elements = [xpathParser searchWithXPathQuery:@"//table[3]/tr[2]/td"];
// Access the first cell
TFHppleElement *element = [elements objectAtIndex:0];
// Get the text within the cell tag
NSString *content = [element content];
[xpathParser release];
[data release];
Znane problemy
Ponieważ hpple jest wrapperem nad XPathQuery, który jest innym wrapperem, ta opcja prawdopodobnie nie jest najbardziej wydajna. Jeśli wydajność jest problem w Twoim projekcie, polecam zakodować własne lekkie rozwiązanie oparte na kodzie biblioteki hpple i xpathquery.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-05 15:09:34
Wygląda na to, że libxml2.2
pojawia się w SDK, a libxml/HTMLparser.h
twierdzi, że:
To brzmi jak to, czego potrzebuję, więc prawdopodobnie użyję tego.Ten moduł implementuje nieweryfikowalny parser HTML 4.0 z API zgodnym z parserami XML. Powinien być w stanie analizować "rzeczywisty" HTML, nawet jeśli jest poważnie uszkodzony z punktu widzenia specyfikacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-02 05:35:05
Na wypadek, gdyby ktoś znalazł się tutaj przez googlowanie dla ładnego parsera XPath i poszedł i użył TFHpple, zauważ, że TFHpple używa XPathQuery. To jest całkiem dobre, ale ma wyciek pamięci.
W funkcji * PerformXPathQuery, jeśli węzły zostaną znalezione jako zerowe, wyskakuje przed czyszczeniem.
Więc gdzie widzisz ten bit kodu: Dodaj w dwóch liniach czyszczenia.
xmlNodeSetPtr nodes = xpathObj->nodesetval;
if (!nodes)
{
NSLog(@"Nodes was nil.");
/* Cleanup */
xmlXPathFreeObject(xpathObj);
xmlXPathFreeContext(xpathCtx);
return nil;
}
Jeśli robisz dużo parsowania, jest to złośliwy wyciek. Teraz.... jak odzyskać noc: -)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 12:57:59
Napisałem lekki wrapper wokół libxml, który może się przydać:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 09:21:43
To prawdopodobnie zależy od tego, jak brudny jest HTML i co chcesz wyodrębnić. Ale zazwyczaj Tidy robi całkiem dobrą robotę. Jest napisany w C i myślę, że powinieneś być w stanie zbudować i statycznie połączyć go dla iPhone ' a. Możesz łatwo zainstalować wersję wiersza poleceń i najpierw przetestować wyniki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-02 02:14:19
Możesz chcieć sprawdzić ElementParser. Zapewnia" wystarczająco " parsowanie HTML i XML. Ładne interfejsy sprawiają, że chodzenie po dokumentach XML / HTML jest bardzo proste. http://touchtank.wordpress.com/
Co powiesz na użycie komponentu Webkit i ewentualnie pakietów innych firm, takich jak jquery, do takich zadań? Czy nie byłoby możliwe pobranie danych html w niewidocznym komponencie i skorzystanie z bardzo dojrzałych selektorów frameworków javascript?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 11:39:41
Google GData Objective-C API reimplements NSXMLElement i inne powiązane klasy, które Apple usunął z iPhone SDK. Znajdziesz go tutaj http://code.google.com/p/gdata-objectivec-client / . używałem go do obsługi wiadomości przez Jabbera. Oczywiście, jeśli twój HTML jest zniekształcony (brakuje tagów zamykających), może to niewiele pomóc.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-02 06:09:22
Używamy Convertigo do analizy HTML po stronie serwera i zwracania czystych i schludnych usług internetowych JSON do naszych aplikacji mobilnych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 18:18:50