Beautiful Soup

Potřebujete něco vydolovat z HTML stránky a vůbec nemáte chuť se zabývat tím, jak HTML vypadá? Beautiful Soup rozkouskuje HTML stránku a vytvoří strom, který se dá procházet. Můžete pak požádat "Najdi všechny odkazy" nebo "Najdi všechny odkazy třídy vnejsiOdkazy nebo "Najdi všechny odkazy jejichž url je "neco.cz" nebo "Najdi tabulku, která má tučně hlavičku, a ten text mi dej."

Tak jste tu správně.

Beautiful Soup je Pythonský HTML/XML parser navržený pro snadné použití v projektech, které se zabývají dolováním dat z HTML stránek. Má dvě nadobyčejné přednosti:

  1. Beautiful Soup nezhavaruje, když mu předávat špatnou značku. Vrátí rozkouskovaný HTML strom, který se bude podobat původnímu dokumentu co nejvíce. Na sběr dat to obyvkle stačí a vy můžete pokračovat dále.
  2. Beautiful Soup poskytuje pár jednoduchých metod a Pythonovských idoimů pro navigaci a prohledávání rozkouskovaného HTML stromu: nástroj na rozebrání dokumentu a vyříznutí toho, co pořebujete. Nemusíte vytvářet vlastní parser pro každou aplikaci.

Hodnotná data umístněná na velmi špatně udělaném webu máte k dispozici během chvilky. Projekty, které by jinak trvaly hodiny, jsou záležitostí několika minut s BeautifulSoup.

Stažení Beautiful Soup

Poslední verze je Beautiful Soup. Můžete si ho stáhnout v jediném souboru nebo jako tarball s instalačním scriptem a unit testy. Beautiful Soup je licencovaný stejným způsobem jako sám Python, takže ho můžete vložit téměř do kterékoliv pythonovské aplikace nebo jako knihovnu a ihned začít používat. Tato verze funguje s Pythonem 2.2+.

Bonus: Pokud vyrábíte RSS feedy z webových stránek použití Beautiful Soup plus Scrape 'N' Feed je téměř ideální.


Jak používat Beautiful Soup?

Tady je pythonovská session, která ukazuje základní přednosti Beautiful Soup.

>>> from BeautifulSoup import BeautifulSoup
>>> import re
>>>
>>> #Vytvoříme soup
... input = '''<html>
... <head><title>Titulek stranky</title></head>
... <body>
... <p id="firstpara" align="center">Toto je odstavec <b>jedna</b>.
... <p id="secondpara" align="blah">Toto je odstavec <b>dva</b>.
... </html>'''
>>> soup = BeautifulSoup(input)
>>>
>>> #Search the soup
... titleTag = soup.html.head.title
>>> print titleTag
<title>Titulek stranky</title>
>>>
>>> print titleTag.string
Titulek stranky
>>>
>>> print len(soup('p'))
2
>>>
>>> print soup('p', {'align' : 'center'})
[<p id="firstpara" align="center">This is paragraph <b>one</b>.
</p>]
>>>
>>> print soup('p', {'align' : 'center'})[0]['id']
firstpara
>>>
>>> print soup.first('p', {'align' : re.compile('^b.*')})['id']
secondpara
>>>
>>> print soup.first('p').b.string
jedna
>>>
>>> print soup('p')[1].b.string
dva
>>>
>>> #Modify the soup
... titleTag['id']='theTitle'
>>> titleTag.contents = ['Jiny titulek.']
>>> print soup.html.head.title
<title id="theTitle">Jiný titulek.</title>

- to platí na BeautifulSoup, ne na editaci této stránky ;-)