Wyciąganie danych ze stron - BeautifulSoup
26.11.2012 | aktual.: 26.11.2012 22:52
W poprzednim wpisie zajęliśmy się wyciąganiem danych ze stron HTML za pomocą biblioteki dla Pythona o nazwie lxml. Dzisiaj jednak zajmiemy się inną biblioteką a mianowicie BeautifulSoup.
1. Skąd wziąć tę zupę?
Naszym pierwszym krokiem który należy wykonać jest zdobycie jej. Możemy ją pobrać za pomocą wielu repozytoriów w systemach Liniksopochodnych oraz za pomocą strony projektu.
2. Zupa jako jedno z dan?
Aby dodać Beautiful Soup do naszego projektu należy zaimportować bibliotekę
import BeautifulSoup
Następnym elementem jest wybrać źródło. Ja standardowo wybrałem stronę pobraną za pomocą urllib2 a później zainicjować dla przykładu używając:
zupa = BeautifulSoup.BeautifulSoup(dane)
gdzie zmienna zupa oznacza kontener którym się będziemy posługiwać dalej a dane oznaczają zmienną string z zawartością strony.
3. Własne danie na bazie zupy
Przejdźmy teraz do praktycznej części w której zajmiemy się kilkoma metodami wyciągania danych za pomocą BeautifulSoup.
3.1 Pobranie wszystkich tagów
To zadanie wykonuje funkcja :
BeautifulSoup.findAll( tag, # nazwa poszukiwanego taga atrybuty = {} #słownik atrybutów )
Zwraca ona listę struktur zawartych w danym tagu Dla przykładu pobierzemy strukture wewnątrz wszystkich tagów
zupa = BeautifulSoup.BeautifulSoup(dane) #inicjujemy użycie biblioteki elementy = zupa.findAll('div') # wyszukujemy po określonym tagu for element in elementy: print element #wyświetlamy strukture każdego diva
3.2 Pobranie jednego taga
To zadanie wykonuje funkcja :
BeautifulSoup.find( tag, # nazwa poszukiwanego taga atrybuty = {} #słownik atrybutów )
Zwraca ona zawartość jednego taga
Aby wyświetlić zawartość taga bez żadnych struktur (tzw czysty tekst) musimy wyodrębnić za pomocą contents[0]
Co jeśli jednak sama nazwa taga nam nie wystarczy do wyszukiwania odpowiedniego elementu ze struktury ?
Wtedy możemy zastosować drugi atrybut funkcji find i findAll w formacie:
{pierwszyatrybut:wartosc,drugiatrybug:wartosc}
4. Propozycja podania
Aby trochę pokazać na przykładzie jak operować tą biblioteką bierzemy na warsztat skrypt podobny do wczorajszego jednak go trochę ulepszymy:
import urllib2 import BeautifulSoup def blog(uzytkownik): dane = urllib2.urlopen('http://www.dobreprogramy.pl/'+uzytkownik).read() zupa = BeautifulSoup.BeautifulSoup(dane) try: artykuly = zupa.findAll('article') for element in artykuly: tytul = element.find('a') czas = element.find('time') print tytul.contents[0] print czas.contents[0] except AttributeError: print 'Ten uzytkownik nie prowadzi bloga' blog('sylwek3100') blog('ulth')
Zadanie skryptu to pobieranie tytułów i czasu elementów na blogu. Jednak w tym wypadku zabezpieczyliśmy skrypt przed użytkownikiem który może nie posiadać jeszcze żadnego wpisu wychwytując wyjątek AttributeError i dając komunikat w razie takowego wykrycia. Można zobaczyć to na przykładzie 2 użytkowników. Co jeśli jednak to nam nie wystarczy i będziemy chcieli pobrać jeszcze ilość komentarzy pod danym wpisem na blogu ?
Wykorzystujemy drugi parametr funkcji find i nim przekazujemy atrybuty danego taga w tym wypadku to wygląda tak:
komentarzy = element.find('span',{'class':'text-h0'}) print komentarzy.contents[0]
Warto jednak zaznaczyć że dalej to musimy przechowywać w tej samej pętli co poprzednie elementy (tytuł, czas).
Jeśli masz jakieś wątpliwości daj znać w komentarzu.
Dziękuje wszystkim czytającym za cierpliwość i uwagę