
3
Python #3 – zpracování HTML
Zatím jsem si procházel jenom obecné základy Pythonu, ale protože můj projekt se věnuje stahování dát z webu, rozhodl jsem se trochu odbočit, resp. pokročit a zkusil jsem si jak se pracuje s HTML stránkami. Použil jsem k tomu dvě knihovny, jednou je urllib2, která by ve standardní distribuci Pythonu měla být automaticky a knihovnu BeautifulSoup, kterou je třeba stáhnout. Po stažení jsem ji vložil přímo do složky se skriptem.
Pro testovací účely jsem si udělal jednoduchou stránku, ze které se pokusím vytahovat data.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import urllib2 from BeautifulSoup import BeautifulSoup url = "http://seitler.cz/www/stranka.html" stranka = urllib2.urlopen(url) soup = BeautifulSoup(stranka) soubor = open('moje.html', 'w') soubor.write(""" <html> <head> <title>Moje stranka</title> </head> <body> <p>Titulek stranky """ + url + """ je """ + soup.html.head.title.text + """</p> </body> </html> """) stranka.close() soubor.close() soup.close() # nebo del soup ?? |
Zkuste si ten kód sami projít, myslím, že to je docela pochopitelné i bez vysvětlení. Nejprve importujeme knihovnu urllib2, která nám zajistí načtení stránky, dále musíme importovat knihonu BS. Řádky 4 a 5 by šly samozřejmě sloučit do jednoho, jejich funkce je jasná. Na 6. řádku vytvoříme objekt soup, do kterého zároveň „načteme“ obsah naší url. Potřebujeme také otevřít soubor, do kterého zapíšeme výslednou stránku, ‚w‘ jako write, to je asi jasné.
Další příkaz již provádí samotný zápis do souboru. Vytvoříme si novou html stránku, ve které vypíšeme titulek stránky vzorové. Vše podstatné se děje na řádku 16, avšak je docela logické, co soup.html.head.title.text dělá. Je to jedna z možností, jak se pohybovat po načtené stránce, postupujeme jakoby „dovnitř“ struktury, začneme u html, podíváme se do hlavičky head, ve které najdeme title a jeho text teprve získáme a zapíšeme. Na závěr už jen zavřeme načtenou stránku, soubor a objekt soup.
Na stránce mám taky dva odstavce. Jak se k nim dostat? Co zobrazí následující příkaz?
print soup.body.p.text
Kdo si ho zkusil napsat nebo je mu to jasné, možná už tuší, jak na to půjdeme. Půjdeme na to od lesa. :) Použijeme funkci find_all(). Kdo by se s ní chtěl více skamarádit, nechť se podívá do dokumentace. Pro moje účely zatím stačí vědět, že touto funkcí můžeme hledat (nejen) tagy v kódu stránky. Není to však tak jednoduché.
print soup.findAll('p') # vypise [<p>Odstavec s textem</p>, <p>Dalsi odstavec s textem</p>]
Vida, získali jsme seznam jednotlivých nalezených tagů. Jak z nich dostat text? Napíšeme si vlastní funkci. Takhle tedy bude vypadat celý skript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import urllib2 from BeautifulSoup import BeautifulSoup def vypis_text(tagy): i = 0 for tag in tagy: i += 1 soubor.write(str(i) + ") " + tag.text + "<br />") url = "http://seitler.cz/www/stranka.html" stranka = urllib2.urlopen(url) soup = BeautifulSoup(stranka) soubor = open('moje.html', 'w') soubor.write(""" <html> <head> <title>Moje stranka</title> </head> <body> <p>Titulek stranky """ + url + """ je """ + soup.html.head.title.text + """</p> Na strance jsou dva odstavce:<br />""") vypis_text(soup.findAll('p')) soubor.write(""" </body> </html> """) stranka.close() soubor.close() soup.close() |
Vypadá to složitě, ale tak hrozné to zas není, vytvořil jsem funkci, která nám do souboru zapíše kromě textu tagu také jeho pořadové číslo. Zápis do souboru jsem tak rozdělil na tři části, nejprve zapíšeme první část, poté ve funkci projdeme všechny nalezené tagy a vypíšeme je a nakonec dopíšeme zbytek stránky. Výsledek si můžete prohlédnout zde. Rozhodně netvrdím, že to je ideální řešení, zatím jsem to ale vymyslel takto, pokud máte někdo lepší řešení nebo nějaké návrhy, rád je uvidím v komentářích.
Zatím tedy dvě takové základní operace s HTML, pokusím se příště přijít s něčím pokročilejším a možná, že do toho zapojím i regulární výrazy. :)

Čti dál:
Vyjádři svůj názor
O mně
kategorie
SSME FI MUNI
FIT VUT
Odkazy
Kupte si odkaz! PR 3, SR 2
Kupte si odkaz! PR 3, SR 2
Kupte si odkaz! PR 3, SR 2
TAGS
Nejčtenější články
- 7 tipů Jak spát méně a efektivněji - 160 028 views
- První semestr na FIT VUT - 86 092 views
- TEST: Kolik spánku je denně potřeba? - 50 958 views
- Jak v PHP nahradit zastaralé funkce ereg a eregi - 49 313 views
- 7 tipů jak si usnadnit a urychlit práci s HTML a CSS - 43 316 views
- Třetí semestr na FIT VUT - 39 626 views
- Čtvrtý semestr na FIT VUT - 37 722 views
- Druhý semestr na FIT VUT - 34 327 views
- 9 nečekaně jednoduchých technik, které z vás udělají mistra komunikace - 31 918 views
- Trend: poplatky za osobní odběr zboží. Bude hůř? - 29 604 views
Nejnovější komentáře
- 5 nových tipů pro lepší spánek « Milan Seitler u 7 tipů Jak spát méně a efektivněji
- 5 nových tipů pro lepší spánek « Milan Seitler u TEST: Je možné spát 6 hodin denně? Tak určitě!
- David u 9 nečekaně jednoduchých technik, které z vás udělají mistra komunikace
- Petr u Bakalářské studium na FIT VUT
- Martin u Jak v PHP nahradit zastaralé funkce ereg a eregi
archiv
- Prosinec 2018
- Listopad 2015
- Září 2015
- Březen 2015
- Květen 2014
- Duben 2014
- Prosinec 2013
- Listopad 2013
- Červenec 2013
- Červen 2013
- Duben 2013
- Březen 2013
- Únor 2013
- Leden 2013
- Prosinec 2012
- Listopad 2012
- Říjen 2012
- Září 2012
- Srpen 2012
- Červenec 2012
- Červen 2012
- Květen 2012
- Březen 2012
- Únor 2012
- Leden 2012
- Listopad 2011
- Říjen 2011
- Srpen 2011
- Červen 2011
- Duben 2011
- Únor 2011
- Leden 2011