lxml的解析函数出错

13 投票
3 回答
10744 浏览
提问于 2025-04-16 00:25

我在Windows平台上安装了lxml2.2.2(我使用的是Python 2.6.5版本)。我尝试了这个简单的命令:

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

但是我遇到了以下错误:

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”

我对接下来该怎么做完全没有头绪,因为我还是Python的新手。请指导我如何解决这个错误。提前谢谢你们!! :)

3 个回答

3

因为评论里不能有换行,所以我在这里分享一下我对 MattH的回答 的实现:

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()
4

根据API文档,它应该可以正常工作:http://lxml.de/api/lxml.html-module.html#parse

看起来这是lxml 2.2.2的一个bug。我刚在Windows上用Python 2.6和2.7测试了一下,结果在2.3.0版本上是可以正常工作的。

所以:升级你的lxml版本就没问题了。

我不太清楚具体是在哪些版本的lxml中出现了这个问题,但我觉得问题不太在lxml本身,而是和用来构建Windows版本的libxml2版本有关。(某些版本的libxml2在Windows上处理http时有问题)

14

lxml.html.parse 这个东西不能用来获取网址。

下面是用 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>

更新
Steven 说得对。lxml.etree.parse 应该可以接受并加载网址。我之前没注意到这一点。我试着删除这个回答,但被拒绝了。

我收回我之前说的关于它不能获取网址的说法。

撰写回答