Zanurkuj w Pythonie/Wyciąganie danych z dokumentu HTML: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Robwolfe (dyskusja | edycje)
Nie podano opisu zmian
Linia 2:
== Wyciąganie danych z dokumentu HTML ==
 
Aby wyciągnąwyciągnąć dane z dokumentu HTML, tworzymy podklasę klasy <tt>SGMLParser</tt> i definiujemy dla encji lub każdego znacznika, który nas interesuje, odpowiednią metodę.
 
Pierwszym krokiem do wydobycia danych z dokumentu HTML jest zdobycie jakiegoś dokumentu. Jeśli posiadasz jakiś dokument HTML na swoim twardym dysku, możesz wykorzystać funkcje plikudo obsługi plików, aby go odczytać, jednak prawdziwa zabawa rozpocznie się, jeśli weźmiesz HTML z istniejącej strony internetowej.
 
'''Przykład 8.5. Wprowadzenie do <tt>urllib</tt>'''
Linia 29:
[...ciach...]</nowiki>
 
# Moduł <tt>urllib</tt> jest częścią standardowej biblioteki Pythona. Zawiera on funkcje służące do pobierania informacji o danych, a także pobierania samych danych z internetu na podstawie adresu URL (głównie strony webinternetowe).
# Najprostszym sposobiesposobem wykorzystaniewykorzystania <tt>urllib</tt>-a, abyjest pobraćpobranie tekstcałego zetekstu strony web,internetowej jestprzy wykorzystaniepomocy funkcji <tt>urlopen</tt>. Otworzenie URL-a jest równie proste, jak otworzenie pliku. Zwracana wartość funkcji <tt>urlopen</tt> przypomina normalny obiekt pliku i posiada niektóre identyczne metody identyczne.
# Najprostszą czynnością, którą możemy wykonać na obiekcie zwróconym przez <tt>urlopen</tt>, jest wywołanie <tt>read</tt>. Metoda ta odczyta cały HTML strony internetowej i zwróci go w postaci napisu, łańcucha znaków. Obiekt ten posiada także metodę <tt>readlines</tt>, która czyta tekst linia po linii, dodając kolejne linie do listy.
# Kiedy skończymy pracę na tym obiekcie, powinniśmy go jeszcze zamknąć za pomocą <tt>close</tt>, podobnie jak normalny plik.
# Mamy kompletny dokument HTML w postaci łańcucha znaków, pobranąpobrany ze strony domowej http://diveintopython.org/ i jesteśmy przygotowani do tego, aby go sparsować.
 
'''Przykład 8.6. Wprowadzenie do <tt>urllister.py</tt>'''
Linia 52:
 
# <tt>reset</tt> jest wywoływany przez metodę <tt>__init__</tt> <tt>SGMLParser</tt>-a, a także można go wywołać ręcznie już po utworzeniu instancji parsera. Zatem jeśli potrzebujesz powtórnie zainicjalizować instancję parsera, który był wcześniej używany, zrobisz to za pomocą <tt>reset</tt> (nie <tt>__init__</tt>). Nie ma potrzeby tworzenia nowego obiektu.
# Zawsze, kiedy parser odnajdzie znacznik <tt><nowiki><a></nowiki></tt>, wywoła metodę <tt>start_a</tt>. Znacznik może posiadać atrybut <tt>href</tt>, a także inne jak na przykład <tt>name</tt>, czy <tt>title</tt>. Parametr <tt>attrs</tt> jest listą krotek, <tt>[(atrybut, wartość), (atrybut, wartość), ...]</tt>. Znacznik ten może być także samym <tt><nowiki><a></nowiki></tt>, poprawnym (lecz bezużytecznym) znacznikiem HTML, a w tym przypadku <tt>attrs</tt> będzie pustą listą.
# Możemy stwierdzić, czy znacznik <tt><nowiki><a></nowiki></tt> posiada atrybut <tt>href</tt>, za pomocą prostego wielozmiennego wyrażenie listowego.
# Porównywanie napisów (np. <tt>k=='href'</tt>) jest zawsze wrażliwe na wielkość liter, lecz w tym przypadku jest to bezpieczne, ponieważ <tt>SGMLParser</tt> konwertuje podczas tworzenia <tt>attrs</tt> nazwy atrybutów na małe litery.
Linia 82:
 
# Wywołujemy metodę <tt>feed</tt> zdefiniowaną w <tt>SGMLParser</tt>, aby przekazać HTML do parsera <ref>
Technicznym określeniem parsera, takiego jak <tt>SGMLParser</tt>, jest konsument (ang. ''consumer''): konsumuje on HTML i rozkłada go. Przypuszczalnie nazwa <tt>feed</tt> (czyli ''karm'' w języku polskim) została wybrana, aby dopasować parser do takiego motywu „konsumenta”. W tym momencie, niektórym może przyjść na myśl zoo, w którym znajduje się ciemna klatka bez drzew, roślin i bez żadnych oznak życia. Jeśli będziesz bardzo cicho i przyglądniesz się bardzo dokładnie, to zobaczyzobaczysz w odległym lewym rogu parę lśniących oczówoczu spoglądających na ciebie, ale przekonujesz sięsam siebie, że to tylko twój mózg płata tobieci figle, a jedyniejedyną możeszrzeczą, która ci powiedziećmówi, że to co widzisz nie jest właściwie pustą klatką, ponieważ jest tutaj na barierce mała, nieszkodliwa tabliczka na barierce z napisem „Nie karmić parsera”. Jednak jest to tylko interesujący obraz, stworzony przez wyobraźnię jednego z autorów tego podręcznika.
</ref>. Metoda ta bierzeprzyjmuje łańcuch znaków, którym w tym przypadku będzie wartość zwrócona przez <tt>usock.read()</tt>.
# Podobnie jak pliki, powinieneś zamknąć swoje obiekty URL, kiedy już nie będą ci potrzebne.
# Powinieneś także zamknąć obiekt parsera, lecz z innego powodu. Podczas czytania danych przekazujemy je do parsera, lecz metoda <tt>feed</tt> nie gwarantuje, że wszystkie przekazane dane, zostały przetworzone. Parser może te dane zbuforować i czekać na dalszą porcję danych. Kiedy wywołamy <tt>close</tt>, mamy pewność, że bufor zostanie opróżniony i wszystko zostanie całkowicie sparsowane.
# Ponieważ parser został zamknięty, więc parsowanie zostało zakończone i <tt>parser.urls</tt> zawiera listę wszystkich URL-ówi, do których linkujelinki zawiera dokument HTML. (Twoje wyjście może wyglądać inaczej, ponieważ z biegiem czasu linki mogły ulec zmianie.)
 
'''Przypisy'''