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?

Author: Charles Stewart, 2009-01-02

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

  1. Menu Projekt - > Edytuj Ustawienia Projektu
  2. wyszukaj ustawienie "ścieżki wyszukiwania nagłówka"
  3. Dodaj nową ścieżkę wyszukiwania "${SDKROOT} / usr / include / libxml2 "
  4. Enable opcja rekurencyjna

- Dodaj bibliotekę libxml2 do swojego projektu

  1. Menu Projekt - > Edytuj Ustawienia Projektu
  2. wyszukaj ustawienie "inne flagi linkera"
  3. Dodaj nową flagę wyszukiwania "- lxml2 "

- From hpple get the following source code files and add them to your projekt:

  1. TFpple.h
  2. TFpple.m
  3. TFppleElement.h
  4. TFppleElement.m
  5. XPathQuery.h
  6. 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.

 88
Author: Albaregar,
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:

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.

To brzmi jak to, czego potrzebuję, więc prawdopodobnie użyję tego.
 48
Author: Sophie Alpert,
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: -)

 20
Author: DavidAWalsh,
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ć:

Objective-C-HMTL-Parser

 12
Author: Ben Reeves,
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.

 5
Author: tcurdt,
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/

 5
Author: ,
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-04-29 20:46:38

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?

 4
Author: tore,
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.

 3
Author: dnolen,
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

 2
Author: Wulkanman,
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