2010-12-06 49 views
2

J'écris un script simple pour aller chercher la grande table grise de here.Analyse HTML: erreur lxml en Python

Le code que j'ai est le suivant:

import urllib2 
from lxml import etree 

html = urllib2.urlopen("http://www.afi.com/100years/movies10.aspx").read() 

root = etree.XML(html) 

mais je reçois une erreur sur la dernière déclaration.

Traceback (most recent call last): 
    File "D:\Workspace\afi100\afi100.py", line 13, in <module> 
    root = etree.XML(html) 
    File "lxml.etree.pyx", line 2720, in lxml.etree.XML (src/lxml/lxml.etree.c:52577) 
    File "parser.pxi", line 1556, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:79602) 
    File "parser.pxi", line 1435, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:78449) 
    File "parser.pxi", line 943, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:75099) 
    File "parser.pxi", line 547, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71467) 
    File "parser.pxi", line 628, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72340) 
    File "parser.pxi", line 568, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71683) 
XMLSyntaxError: Space required after the Public Identifier, line 3, column 59 

Une idée comment puis-je contourner cette erreur?

Merci.

+1

Vous pensez que c'est une bonne idée d'analyser HTML en utilisant un analyseur XML? – khachik

+0

Vous devriez n'importe quel outil HTML au XML (xhtml) disponible. – khachik

+0

J'avais la fausse impression que HTML était un sous-ensemble de XML (ce n'est pas le cas, mais XHTML l'est). Il ya une bonne description des différences majeures à http://techforum4u.com/content.php/318-What-is-the-difference-between-HTML-and-XML – naught101

Répondre

8

Vous essayez d'analyser HTML avec l'analyseur XML, vous devez utiliser l'analyseur HTML lxml.

import urllib2 
from StringIO import StringIO 
from lxml import etree 

ufile = urllib2.urlopen("http://www.afi.com/100years/movies10.aspx") 

root = etree.parse(ufile, etree.HTMLParser()) 

print etree.tostring(root) 
+0

Intéressant, est-ce un vrai analyseur HTML ou ne fait-il que définir le drapeau de récupération de 'libxml2'? –

+0

Merci beaucoup. Cela a fonctionné parfaitement. – nunos

1

Le document que vous liez n'est pas bien XHTML, par conséquent vous ne pouvez pas utiliser un analyseur XML pour le charger. Vous devez utiliser un analyseur HTML comme Beautiful Soup à la place.

+0

Thansk pour la réponse. Est-ce que libxml2dom fonctionnerait à la place? Je l'ai déjà utilisé. – nunos

+0

@nunos, probablement pas, puisqu'il s'agit d'une liaison à la bibliothèque 'libxml2' qui, à ma connaissance, ne prend en charge que de façon fiable un format XML bien formé. –

+0

tandis que vous pouvez utiliser Beautiful Soup, lxml peut également gérer HTML (voir la réponse acceptée de koblas). –