Úno
3

Python #3 – zpracování HTML

By majlan  //  Programování, Python  //  Komentářů: 0

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. :)

Vyjádři svůj názor



Zajímá vás cokoliv o mobilních aplikacích? Uvažujete o spolupráci? Kontaktujte mne na seitler@reinto.cz

O mně

Jmenuji se Milan Seitler a jsem spoluzakladatelem společnosti Reinto s.r.o., ve které se věnujeme mobilním i webovým aplikacím a marketingu.

Zabývám se celým procesem tvorby mobilních a webových aplikací. Nejvíce se věnuji návrhu aplikace a UX/UI designu. Kladu velký důraz na jednoduchost a srozumitelnost uživatelského rozhraní.

Zajímám se o online i offline podnikání, fascinují mě úspěšní lidé, kteří se nebojí tvrdé práce. Mou hlavní motivací je konkurence, která mě vždy nutí jít do všeho naplno, protože nerad prohrávám.

Mám rád hudbu, knížky, sport a cestování.

milan@seitler.cz

Odkazy

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Inzerujte zde!

Kupte si odkaz! PR 3, SR 2

Partner links