2012-03-20 24 views
5

Sono novizio a lxml. Vorrei scaricare la pagina web e ottenere i dati interessati da, il mio codice è:lxml in python, parse dall'URL

import urllib2 
from lxml import etree 

url = "http://www.example.com/" 

html = urllib2.urlopen(url) 

root = etree.parse(html) # the problem is here 

qualcuno mi può spiegare perché è sbagliato?

errore è:

Traceback (most recent call last): 
    File "yatego.py", line 10, in <module> 
    root = etree.parse(html) 
    File "lxml.etree.pyx", line 2942, in lxml.etree.parse (src/lxml/lxml.etree.c:54187) 
    File "parser.pxi", line 1550, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:79703) 
    File "parser.pxi", line 1580, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:80012) 
    File "parser.pxi", line 1463, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:78908) 
    File "parser.pxi", line 1019, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:75905) 
    File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739) 
    File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614) 
    File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955) 
lxml.etree.XMLSyntaxError: Entity 'mdash' not defined, line 4, column 21 

Questo codice:

url = "http://www.example.com/" 

res = requests.get(url) 
doc = lxml.html.parse(res.content) 

dà questo errore:

File "yatego.py", line 11, in <module> 
    doc = lxml.html.parse(res.content) 
    File "/usr/lib/python2.7/dist-packages/lxml/html/__init__.py", line 692, in parse 
    return etree.parse(filename_or_url, parser, base_url=base_url, **kw) 
    File "lxml.etree.pyx", line 2942, in lxml.etree.parse (src/lxml/lxml.etree.c:54187) 
    File "parser.pxi", line 1528, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:79485) 
    File "parser.pxi", line 1557, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:79768) 
    File "parser.pxi", line 1457, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:78843) 
    File "parser.pxi", line 997, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:75698) 
    File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739) 
    File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614) 
    File "parser.pxi", line 583, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71927) 
IOError: Error reading file '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>IANA &mdash; Example domains</title> 

Questo codice:

doc = lxml.html.parse(url) 

funziona bene

Quindi dov'è il problema?

+0

Qual è il problema? Cosa ti aspettavi e cosa hai ottenuto? – Dikei

+0

quale messaggio di errore ricevi? cosa ti aspetti che accada? – Mizipzor

risposta

9

la chiave qui è l'eccezione:

IOError: Error reading file '<!DOCTYPE html PUBLIC ... 

Stai passando il contenuto di un file a una funzione che si aspetta un percorso per un file. Lo stesso motivo doc = lxml.html.parse(url) funziona, un url "è un" percorso file.

Il seguente funziona meglio?

doc = lxml.html.fromstring(res.content) 
+0

Significa che questo è sbagliato: res = requests.get (url) doc = lxml.html.parse (res.content) – user873286

+0

sì, la linea in cui si assegnare a 'doc' è sbagliato (a meno che non mi sbagli) e dovrei guardare come ho postato. – Mizipzor

0

È necessario utilizzare html.read() per iniziare: HTML non è un tipo di stringa. Inoltre, dovresti controllare se l'URL è stato scaricato correttamente, poiché ciò non è assolutamente garantito.

UPD. Utilizzare html.parse(filename_or_url)

4

È necessario utilizzare lxml.html per analizzare HTML anziché lxml.etree.

È inoltre possibile aprire l'URL direttamente con lxml:

doc = lxml.html.parse(url) 

volte lxml avrà problemi a trattare con stranezze di HTTP, nel qual caso avresti bisogno di utilizzare una soluzione più robusta per recuperare le pagine, come requests :

res = requests.get(url) 
doc = lxml.html.parse(res.content) 
+0

Questo funzionerà un po 'meglio. Non è del tutto sicuro se funziona con lxml.html.parse, ma so che funziona con lxml.etree.parse. res = requests.get (url); doc = lxml.html.parse (res .raw') –