lxml中的解析函数出错

时间:2010-06-25 07:28:30

标签: python windows parsing lxml

我在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 个答案:

答案 0 :(得分:13)

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>

<强>更新
史蒂文是对的。 lxml.etree.parse应接受并加载网址。我错过了。我试过删除这个答案,但我不被允许。

我撤回了关于它没有提取网址的声明。

答案 1 :(得分:4)

根据api文档,它应该有效:http://lxml.de/api/lxml.html-module.html#parse

这似乎是lxml 2.2.2中的一个错误。我刚刚在使用python 2.6和2.7的Windows上进行了测试,它确实可以与2.3.0一起使用。

所以:升级你的lxml,你会没事的。

我不知道究竟在哪个版本的lxml中出现问题,但我认为问题不在于lxml本身,而是用于构建windows二进制文件的libxml2版本。 (某些版本的libxml2在Windows上出现http问题)

答案 2 :(得分:3)

由于评论中不允许换行,因此这是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()