解析HTML:Python中lxml出现错误

4

我正在编写一个简单的脚本,从这里获取大灰色表格。

我的代码如下:

import urllib2
from lxml import etree

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

root = etree.XML(html)

但是在最后一个语句上出现了一个错误。
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

你有什么想法可以解决这个错误吗?

谢谢。


1
你觉得使用XML解析器来解析HTML是个好主意吗? - khachik
你应该使用任何可用的HTML转XML(xhtml)工具。 - khachik
我曾错误地认为HTML是XML的子集(实际上不是,但XHTML是)。在http://techforum4u.com/content.php/318-What-is-the-difference-between-HTML-and-XML上有一个关于主要区别的良好描述。 - naught101
2个回答

10

您正在使用XML解析器解析HTML,您应该使用lxml HTML解析器。

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)

有趣的是,它是一个真正的HTML解析器还是只设置了libxml2的恢复标志? - Frédéric Hamidi

1

你链接的文档不是格式良好的XHTML,因此无法使用XML解析器加载它。

你必须使用像Beautiful Soup这样的HTML解析器。


谢谢回复。libxml2dom可以使用吗?我以前用过它。 - nunos
@nunos,可能不行,因为它是绑定到libxml2库的,据我所知,该库只可靠地支持格式良好的XML。 - Frédéric Hamidi
虽然你可以使用Beautiful Soup,但lxml也可以处理HTML(请参见koblas的被接受的答案)。 - Bala Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接