Skrobanie i analizowanie strony Wikipedii

Zastanawiam się, czy istnieją jakieś istniejące biblioteki w Objective-C lub dostępne z niego, które pozwoliłyby mi zeskrobać strony sformatowane jak TA. W szczególności, wszystkie daty i cały tekst obok każdej daty. Jeśli nie, to jaki byłby najlepszy sposób na zrobienie tego? Wyrażenia regularne? Słyszałem, że NSString może mieć już wbudowane metody na to. Czy to prawda?

Rozglądałem się wokół, aby zobaczyć, czy są jakieś alternatywy dla skrobania, takie jak plik XML lub API. Znalazłem API, ale jedynymi klientami, które widzę dostępne są w innych językach i wydają się po prostu być w stanie publikować treści na stronach, a nie pobierać go.

EDIT : więc znalazłem więcej informacji na temat API pod tymi linkami:

I udało mi się wymyślić to żądanie , które zwraca jakiś kodowany HTML tekst (Cóż format to XML, ale zawiera tekst strony taki jak »a href= itd. Będę nadal przeglądać dokumenty, aby zobaczyć, czy mogę sprawić, że wyjdzie to trochę lepiej, jeśli nie, czy są jakieś zalecenia dotyczące parsowania tego?

EDIT 2: W porządku, więc dzięki tej stronie doc, najprostszym i najczystszym sposobem, jaki udało mi się odzyskać dane, jest użycie skonstruowanego linku, który zwraca surowe dane (w znacznikach wiki) odpowiedniej sekcji. Jednak myślę, że będę musiał to przeanalizować, chociaż jeśli to naprawdę jest sprawa powinna być o wiele łatwiejsza niż cały artykuł.

Czy ktoś ma jakieś zalecenia dotyczące parsowania znaczników wiki, takie jak poniższe w Objective-C?

==Events==
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

To, co chcę skończyć, to chyba NSDictionary lub podobna kolekcja, która będzie przechowywać datę wraz z dołączonym fragmentem informacji. Dzięki!

Author: Damjan Pavlica, 2009-10-27

7 answers

Mam zamiar iść z sugerując regex dla ukierunkowanej ekstrakcji danych w mieszanym strumieniu danych HTML.

Istnieją już Biblioteki RegEx w telefonie, są one jakby Ukryte - można je odsłonić za pomocą kilku prostych połączeń za pomocą RegexKitLite (Upewnij się, aby przewinąć w dół i uzyskać wersję light). W końcu jest to klasa z kilkoma rozszerzeniami na NSString, która pozwala Ci robić wyrażenia regularne, a następnie definiujesz wyrażenia regularne z dwoma przechwyconymi dopasowaniami - jednym dla liczby i jednym dla zawartość, wraz z szeregiem nie przechwyconych dopasowań dla tagów załączających i pośrednich. Nawet jeśli jest to "lite" wersja Standard RegEX to sill obsługuje prawie każdą zdolność trzeba.

Podejście API jest obiecujące, ale po uzyskaniu znaczników surowych prawdopodobnie będziesz musiał zastosować podobne podejście regex do parsowania danych z tego. Mimo to może to mieć sens, jeśli zmniejsza złożoność wyrażeń regularnych i czas transferu danych, nie ma powodu, aby nie można połączyć obu zbliża się.

 1
Author: Kendall Helmstetter Gelner,
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-10-27 20:45:33

Dodaj &format=fmt na końcu zapytania, zgodnie z opisem w API: Data_formats . Twoje zapytanie staje się na przykład: JSON query. Możesz określić XML, JSON lub wiele innych formatów.

Możesz łatwo przeanalizować ogólne sekcje, a następnie po prostu wyświetlić format HTML w widoku sieci Web.

 4
Author: Matt B.,
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-10-27 20:49:12

Biorąc pod uwagę, że strony w Wikipedii są przechowywane jako zwykły tekst, a wprowadzane przez użytkowników jako zwykły tekst, nie uzyskasz z niego uporządkowanego zestawu danych.

 3
Author: kprevas,
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-10-27 20:45:53

Zeskrobałem wiele danych z WP na różne sposoby. format zależy od wielu rzeczy, w tym od rodzaju subdomeny, w której znajduje się informacja i kiedy została wprowadzona. Główny tekst jest wolny format i nie ma prostego sposobu, aby go zeskrobać. Infoboksy są w specjalnym formacie WP, który zmieniał się na przestrzeni lat. Nie został zaprojektowany do drapania.

Istnieje baza danych wspierająca WP, która jest nieco bardziej ustrukturyzowana.

Zdecydowanie najlepszą strategią jest kontakt z Wikipedyści w domenie, którą chcesz zeskrobać-będą wiedzieli o formacie bazy danych i mogą być w stanie pomóc-na pewno będą chcieli pomóc, ponieważ będą chcieli zobaczyć WP w formie semantycznej (np. http://dbpedia.org/About).

 3
Author: peter.murray.rust,
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-10-27 21:07:59

Czy Python się liczy? ;) Jest to dostępne z Objective-C . I są świetne moduły do skrobania: piękne mydło i / lub mechanize, można również rozważyć lxml.

 2
Author: Piotr Byzia,
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-10-27 21:09:43

To zdecydowanie nie jest sposób, aby to zrobić, w każdym języku.

Jeśli jakakolwiek witryna internetowa w przyjemny sposób ujawni swoje dane, to będzie to wikipedia.

Spójrz na uzyskanie artykułu jako XML, jako RDF, a może nawet jako JSON.

 0
Author: Oren Mazor,
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-10-27 20:09:30

Mam aplikację na iPhone ' a, która wykonuje scrapowanie ekranu za pomocą:

Używając YQL możesz uzyskać wszystkie potrzebne informacje z sieci używając zapytań XPATH przeciwko DOM.

Osobiście uważam, że jego znacznie lepiej niż za pomocą Regex. Z drugiej strony znam tylko bardzo proste wyrażenia regularne.

 0
Author: nolim1t,
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-10-28 10:54:24