2010-06-25 10 views
12

ho installato lxml2.2.2 su piattaforma Windows (im utilizzando Python versione 2.6.5) .i provato questo semplice comando:errore con la funzione di analisi in lxml

from lxml.html import parse 
p= parse(‘http://www.google.com’).getroot() 

ma sto ottenendo il seguente errore:

Traceback (most recent call last): 
File “”, line 1, in p=parse(‘http://www.google.com’).getroot() 
File “C:\Python26\lib\site-packages\lxml-2.2.2-py2.6-win32.egg\lxml\html_init_.py”, line 661, in parse return etree.parse(filenameorurl, parser, baseurl=baseurl, **kw) 
File “lxml.etree.pyx”, line 2698, in lxml.etree.parse (src/lxml/lxml.etree.c:49590) 
File “parser.pxi”, line 1491, in lxml.etree.parseDocument (src/lxml/lxml.etree.c:71205) File “parser.pxi”, line 1520, in lxml.etree.parseDocumentFromURL (src/lxml/lxml.etree.c:71488) 
File “parser.pxi”, line 1420, in lxml.etree.parseDocFromFile (src/lxml/lxml.etree.c:70583) 
File “parser.pxi”, line 975, in lxml.etree.BaseParser.parseDocFrom 
File (src/lxml/lxml.etree.c:67736) 
File “parser.pxi”, line 539, in lxml.etree.ParserContext.handleParseResultDoc (src/lxml/lxml.etree.c:63820) 
File “parser.pxi”, line 625, in lxml.etree.handleParseResult (src/lxml/lxml.etree.c:64741) 
File “parser.pxi”, line 563, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64056) 
IOError: Error reading file ‘http://www.google.com’: failed to load external entity “http://www.google.com” 

non ho idea di cosa fare dopo sono un novizio di python. per favore guidami a risolvere questo errore Grazie in anticipo!! :)

risposta

12

lxml.html.parse non recupera URL.

Ecco come farlo con urllib2:

>>> from urllib2 import urlopen 
>>> from lxml.html import parse 
>>> page = urlopen('http://www.google.com') 
>>> p = parse(page) 
>>> p.getroot() 
<Element html at 1304050> 

Aggiornamento
Steven ha ragione. lxml.etree.parse dovrebbe accettare e caricare URL. Ho perso questo. Ho provato a cancellare questa risposta, ma non sono autorizzato.

Ritraggo la mia affermazione al riguardo non recuperando gli URL.

+0

vi ringrazio molto per chiarire !! questa grande opera:) – silentNinJa

+0

Siete i benvenuti! – MattH

+1

Ci scusiamo, ma lo fa (o almeno dovrebbe) recuperare anche gli URL. Ci deve essere qualche altra ragione. Forse prova prima ad aggiornare all'ultima versione lxml. – Steven

4

Secondo la documentazione API dovrebbe funzionare: http://lxml.de/api/lxml.html-module.html#parse

questo sembra essere un bug in lxml 2.2.2. Ho appena testato su Windows con Python 2.6 e 2.7 e funziona con 2.3.0.

Quindi: aggiorna il tuo lxml e starai bene.

Non so esattamente in quali versioni di lxml si verifica il problema, ma credo che il problema non fosse tanto con lo stesso lxml, ma con la versione di libxml2 utilizzata per costruire il binario di Windows. (Alcune versioni di libxml2 avuto un problema con http sulle finestre)

+0

Ti rendi conto che la domanda è stata fatta più di un anno fa, sì? E 'stata trovata una soluzione? – MattH

+0

@MattH: eh, no non l'ho fatto. Grazie per averlo menzionato. In qualche modo è apparso come nuovo nel mio feed di Google Reader (mostra ancora "30 giugno 2011"), e non ho guardato più da vicino ... – Steven

+0

Quindi, se ho ancora questo errore, e 'tuorlo -l | grep lxml' restituisce 'lxml - 2.3 - active' Cosa significa? –

3

Dal interruzioni di riga non sono ammessi nei commenti, ecco la mia implementazione di MattH's answer:

from urllib2 import urlopen 
from lxml.html import parse 

site_url = ('http://www.google.com') 

try: 
    page = parse(site_url).getroot() 
except IOError: 
    page = parse(urlopen(site_url)).getroot() 
Problemi correlati