PDA

View Full Version : [Python] Parsing di un file HTML


arara
18-09-2007, 21:13
Sto studiando come accedere a informazioni mirate contenute in una pagina web tramite Python, quindi con PyXML e DOM.

Questo č un esempio che sto studiando, deve aprire una pagina, listare tutte le immagini e stamparne l'attributo "src", perņ si comporta in modo strano:

from xml.dom.ext.reader import HtmlLib

reader = HtmlLib.Reader()

doc_node = reader.fromUri("http://www.google.com/firefox")

images = doc_node.documentElement.getElementsByTagName("img")

for image in images:
print image.getAttribute("src")

Il metodo getAttribute("src") ritorna una stringa vuota, e il metodo hasAttribute("src") ritorna false.
Se pero effettuo questa chiamata: image.attributes.item(0).nodeValue, ritorna l'attributo src corretto...

Mi chiedo perchč getAttribute("src") non mi ritorni pure lui il valore corretto, visto che serve apposta per quello.:confused:

arara
18-09-2007, 21:26
Se eseguo dir(image) mi stampa questo, dovrebbe essere un dizionario di tuple e oggetti di tipo Node... č qui che il metodo getAttribute("tag") dovrebbe andare a cercare l'attributo.

(l'indentazione l'ho aggiunta io...)
<NamedNodeMap at 8433b2c:
{
(None, u'src'): <Attribute Node at 8433b8c: Name="src", Value="/images/firefox/clear.gif">,
(None, u'width'): <Attribute Node at 843742c: Name="width", Value="1">,
(None, u'height'): <Attribute Node at 8433fcc: Name="height", Value="20">
}
>

marco.r
18-09-2007, 22:25
Sto studiando come accedere a informazioni mirate contenute in una pagina web tramite Python, quindi con PyXML e DOM.

Questo č un esempio che sto studiando, deve aprire una pagina, listare tutte le immagini e stamparne l'attributo "src", perņ si comporta in modo strano:

L'html č una bestia insidiosa... soprattutto non fidarti del fatto che il codice che scarichi sia valido. A PyXML meglio secondo me una libreria apposita.
Una fatta molto bene e' BeautifulSoup:
http://www.crummy.com/software/BeautifulSoup/


from BeautifulSoup import BeautifulSoup
from urllib2 import urlopen
soup = BeautifulSoup( urlopen('http://www.google.com/firefox').read() )
for image in soup.findAll('img'):
print image['src']

Questo stampa gli indirizzi di tutte le immagini contenute. Ma ci sono un sacco di metodi per cercare per contenuto, regex, attributo etc., oltre che diverse funzioni per navigare l'albero. Consigliatissimo.
Se poi devi pure navigarci sulle pagine (autenticarti, cliccare un paio di link, scaricare un altro file...) usa anche http://wwwsearch.sourceforge.net/mechanize/

arara
18-09-2007, 23:00
bene bene, funziona! :D

Questo metodo mi sembra perfetto per quello che devo fare:

titleTag = soup.html.head.title
print titleTag

^TiGeRShArK^
19-09-2007, 09:51
Se poi devi pure navigarci sulle pagine (autenticarti, cliccare un paio di link, scaricare un altro file...) usa anche http://wwwsearch.sourceforge.net/mechanize/
fiko c'č pure per python :D
io lo sto usando in ruby x ora :p

P.S. potevi rispondere anke al mio thread allora quando cercavo qualcosa ke facesse ciņ prima di scoprire mechanize :mad:

:D