WebProg-2012/Gyakorlat3

A MathWikiből
(Változatok közti eltérés)
(Élesben a web-rõl)
 
(2 szerkesztő 7 közbeeső változata nincs mutatva)
13. sor: 13. sor:
  
 
* A webrõl html oldalt a következõ függvénnyel tölthetünk le egy string-be:
 
* A webrõl html oldalt a következõ függvénnyel tölthetünk le egy string-be:
  require urllib
+
  import urllib
  
 
  def get_html(uri):
 
  def get_html(uri):
24. sor: 24. sor:
 
* Hogy elkezdhessünk bányászni, a következõket kell megtennünk:
 
* Hogy elkezdhessünk bányászni, a következõket kell megtennünk:
 
  import StringIO
 
  import StringIO
   
+
  parser = etree.HTMLParser()
 
  html = etree.parse(StringIO.StringIO(html_str),parser)
 
  html = etree.parse(StringIO.StringIO(html_str),parser)
  
50. sor: 50. sor:
 
* Ez a függvény még nagyon hasznos lehet:
 
* Ez a függvény még nagyon hasznos lehet:
 
  def inner_html(xpath):
 
  def inner_html(xpath):
return etree.tostring(xpath, pretty_print=True, method="html", encoding='iso-8859-2')
+
    return etree.tostring(xpath, pretty_print=True, method="html", encoding='iso-8859-2')
 
: Ez nem csak a megadott csúcsban található szöveget írja ki, hanem az egész részfát, pl:
 
: Ez nem csak a megadott csúcsban található szöveget írja ki, hanem az egész részfát, pl:
  inner_html(h.xpath('/html/body/p')[1])
+
  inner_html(html.xpath('/html/body/p')[1])
 
: Kiírná a teljes html kódot ami a /html/body-n belül a második 'p'-ben van.
 
: Kiírná a teljes html kódot ami a /html/body-n belül a második 'p'-ben van.
  
  
 
Példákat ezekre találhattok Simon András eredeti elõadásanyagában [http://math.bme.hu/~asimon/wp/2011/ea2/ itt]
 
Példákat ezekre találhattok Simon András eredeti elõadásanyagában [http://math.bme.hu/~asimon/wp/2011/ea2/ itt]
 
  
 
== Feladatok ==
 
== Feladatok ==
77. sor: 76. sor:
 
# Gyûjtsétek ki bármelyik táblázatból azokat az adatokat amiknek a class-a "allat"!
 
# Gyûjtsétek ki bármelyik táblázatból azokat az adatokat amiknek a class-a "allat"!
 
# Mentsétek file-ba annak a táblázatnak a részhtml-jét amelyik elérési útvonalában legalább 2 div van!
 
# Mentsétek file-ba annak a táblázatnak a részhtml-jét amelyik elérési útvonalában legalább 2 div van!
 +
: Ehhez egy kis segítség, a második gyakorlat végén van a file kezelésrõl. Vagy csinálhatjátok úgy, hogy printelitek a részhtml-t és a shell-ben nem python file.py-t hanem python file.py >> resz.html -t írtok, ezzel amit printelne a terminálba azt helyette elmenti a resz.html-be.
  
  
 
=== Élesben a web-rõl ===
 
=== Élesben a web-rõl ===
  
#
+
# A math.bme.hu-ról (lehetséges, hogy http://math.bme.hu/html/index.html kell a get_html-nek) bányásszátok ki a legelsõ hírt (jobb fent), ezt mentsétek egy külön html-be és nézzétek meg szép-e!
 +
# A math.bme.hu algebra oktatói oldaláról bányásszátok ki az összes oktató nevét!
 +
# http://www.weatheronline.co.uk/-rõl bányásszátok ki Budapest Tmin és Tmax-át, a mai napról (a script úgy mûködjön, hogy mindig az adott napról olvassa ki a hõmérsékletet, szóval ha holnap futtatod, akkor a holnapi hõmérsékletet írja ki, azaz mindig a táblázat elsõ oszlopából kell válogatni)
 +
# Az index.hu-ról olvassátok ki a fõ hír linkjét és címét!
 +
 
 +
=== Bónusz ===
 +
 
 +
* Írjatok egy scriptet, ami kér egy magyar nagyvárost, és ha a weatheronline-on fent van az adott városra a hõmérséklet, akkor visszaadja a Tmin és Tmax-ot. Segítség:
 +
** A http://www.weatheronline.co.uk/Hungary/Budapest.htm bal oldalán a menüben ott van az összes város amit ismer.
 +
** A link amint láthatjátok a városnév alapján van, így a Bicskeit könnyen megkaphatod, ha a Budapestet lecseréled a linkben Bicskére.
 +
** Elõször csináljátok meg úgy, hogy az ékezet nélküliekre mûködjön, az ékezetesekkel szenvedjetek csak utoljára.

A lap jelenlegi, 2012. szeptember 20., 15:46-kori változata

Tartalomjegyzék

Bevezetés

  • Ami mindenképp kelleni fog a python file-od elejére:
from lxml import etree
  • Az lxml dokumentációját megtaláljátok ezen az oldalon.


  • Valószinüleg kelleni fog még, hogy a karakter kódolás jó legyen:
import sys
reload(sys)
sys.setdefaultencoding("iso-8859-2")


  • A webrõl html oldalt a következõ függvénnyel tölthetünk le egy string-be:
import urllib
def get_html(uri):
    u = urllib.urlopen(uri)
    return u.read()
  • Utána simán beírhatjuk:
html_str = get_html("http://www.google.com")


  • Hogy elkezdhessünk bányászni, a következõket kell megtennünk:
import StringIO
parser = etree.HTMLParser()
html = etree.parse(StringIO.StringIO(html_str),parser)


  • Ezek után használhatjuk az xpath függvényt, a következõ módon:
html.xpath("/html/body/p")
ahol a /html/body/p az útvonal a html-fában.
  • Az xpath függvény egy listát fog visszaadni, így vagy [0], [1] stb.-vel kérdezzétek le az elemeit, vagy egy for ciklussal menjetek végig rajta.
  • Ha már lekértétek valamelyik elemét, akkor a text adattagjában van a benne tárolt szöveg, pl:
h.xpath("/html/body/p")[1].text
ez lekéri a második html/body-n belüli p-nek a szövegét


  • Az xpath-ban a következõket használhatjátok még:
    • /html//p - a html-en belül bármilyen útvonalon elérhetõ p-k
    • /html/body/* - a közvetlenül /html/body alatti összes csúcs
    • /*/*/ul - a 2 hosszú úton elérhetõ ul-ek
    • //a[@href='http://math.bme.hu'] - bármilyen útvonalon elérhetõ 'a'-k amiknek a href attribútuma a 'http://math.bme.hu'
    • az elõzõt tagadhatjátok is, hogy olyanokat keressen ami nem rendelkezik valamilyen attribútummal: //hr[not(@noshade)]
  • Ha valamelyik csúcs attribútumának meg szeretnétek tudni az értéket, a következõképpen tudjátok ezt megtenni:
html.xpath("//hr")[0].get('size')
ez lekéri az elsõ hr-nek a size attribútumát


  • Ez a függvény még nagyon hasznos lehet:
def inner_html(xpath):
    return etree.tostring(xpath, pretty_print=True, method="html", encoding='iso-8859-2')
Ez nem csak a megadott csúcsban található szöveget írja ki, hanem az egész részfát, pl:
inner_html(html.xpath('/html/body/p')[1])
Kiírná a teljes html kódot ami a /html/body-n belül a második 'p'-ben van.


Példákat ezekre találhattok Simon András eredeti elõadásanyagában itt

Feladatok

Teszt html-en

Töltsétek le a következõt html-t: html

A következõ feladatokat mind ezen a test.html-en végezzétek el, ezt parse-olni a következõ módon tudjátok:

parser = etree.HTMLParser()
html = etree.parse("./test.html", parser)
  1. Írjátok ki az elsõ 'p'-nek a tartalmát!
  2. Írjátok ki a második ul részfájának a teljes html-ét! (Ezt az inner_html függvénnyel tudjátok könnyen.)
  3. Írjátok ki az összes li tartalmát egy for ciklussal!
  4. Navigáljatok el ahhoz a hr-hez, aminek a size attribútuma 1! (Úgy tudjátok leellenõrizni, hogy jól megtaláltátok-e, ha az inner_html-el írjátok ki.)
  5. Írjátok ki annak az ul-nek a tartalmát, ami 3 lépésben elérhetõ (tehát õ 4 mélységben van).
  6. Írjátok ki annak a táblázatnak a summary attribútumát amelyiknek a border-e "1"!
  7. Gyûjtsétek ki bármelyik táblázatból azokat az adatokat amiknek a class-a "allat"!
  8. Mentsétek file-ba annak a táblázatnak a részhtml-jét amelyik elérési útvonalában legalább 2 div van!
Ehhez egy kis segítség, a második gyakorlat végén van a file kezelésrõl. Vagy csinálhatjátok úgy, hogy printelitek a részhtml-t és a shell-ben nem python file.py-t hanem python file.py >> resz.html -t írtok, ezzel amit printelne a terminálba azt helyette elmenti a resz.html-be.


Élesben a web-rõl

  1. A math.bme.hu-ról (lehetséges, hogy http://math.bme.hu/html/index.html kell a get_html-nek) bányásszátok ki a legelsõ hírt (jobb fent), ezt mentsétek egy külön html-be és nézzétek meg szép-e!
  2. A math.bme.hu algebra oktatói oldaláról bányásszátok ki az összes oktató nevét!
  3. http://www.weatheronline.co.uk/-rõl bányásszátok ki Budapest Tmin és Tmax-át, a mai napról (a script úgy mûködjön, hogy mindig az adott napról olvassa ki a hõmérsékletet, szóval ha holnap futtatod, akkor a holnapi hõmérsékletet írja ki, azaz mindig a táblázat elsõ oszlopából kell válogatni)
  4. Az index.hu-ról olvassátok ki a fõ hír linkjét és címét!

Bónusz

  • Írjatok egy scriptet, ami kér egy magyar nagyvárost, és ha a weatheronline-on fent van az adott városra a hõmérséklet, akkor visszaadja a Tmin és Tmax-ot. Segítség:
    • A http://www.weatheronline.co.uk/Hungary/Budapest.htm bal oldalán a menüben ott van az összes város amit ismer.
    • A link amint láthatjátok a városnév alapján van, így a Bicskeit könnyen megkaphatod, ha a Budapestet lecseréled a linkben Bicskére.
    • Elõször csináljátok meg úgy, hogy az ékezet nélküliekre mûködjön, az ékezetesekkel szenvedjetek csak utoljára.
Személyes eszközök