2017-06-06 157 views
0

我正在尝试运行此程序。直到今天,它一切正常。代码中的任何内容都没有改变。lxml etree解析失败(IOError)

import lxml.etree 
import urlparse 
import re 

def parse_url(url): 
    return lxml.etree.parse(url, lxml.etree.HTMLParser()) 

urlivv = "http://finance.yahoo.com/q?s=IVV" 
docivv = parse_url(urlivv) 

这是我的错误信息:

IOError: Error reading file 'http://finance.yahoo.com/q?s=IVV': failed to load external entity "http://finance.yahoo.com/q?s=IVV"

有大约增加StringIO的说法在网站上的一些文件(见下文)。但我觉得很奇怪,我从来没有这样做过。

tree = etree.parse(StringIO(myString)) 

编辑:更完整的堆栈跟踪。

>>> import lxml.etree 
>>> tree = lxml.etree.parse('http://finance.yahoo.com/q?s=IVV', parser=lxml.etree.HTMLParser()) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "src\lxml\lxml.etree.pyx", line 3427, in lxml.etree.parse (src\lxml\lxml.etree.c:81100) 
    File "src\lxml\parser.pxi", line 1811, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:117831) 
    File "src\lxml\parser.pxi", line 1837, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:118178) 
    File "src\lxml\parser.pxi", line 1741, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:117090) 
    File "src\lxml\parser.pxi", line 1138, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:111636) 
    File "src\lxml\parser.pxi", line 595, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:105092) 
    File "src\lxml\parser.pxi", line 706, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:106800) 
    File "src\lxml\parser.pxi", line 633, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:105611) 
OSError: Error reading file 'http://finance.yahoo.com/q?s=IVV': failed to load external entity "http://finance.yahoo.com/q?s=IVV" 
+2

你说“这工作正常,直到今天。代码中没有任何内容改变了,“但是你从一个你不能控制的web服务器上下载文件。看起来很可能在服务器端发生了一些变化,现在您需要更新代码来处理更改。 – bdesham

+0

@bdesham感谢您的回复。我还是比较新的,所以请耐心等待。这个问题似乎出现在几个不同的网站上,这些网站大概是由不同的网络服务器控制的(或者我在这里是无知的)。由于在几个网址上出现同样的原因,我认为这是一个代码问题。无论我不确定如何更新代码来处理更改,欢迎提供任何反馈意见。 – GC123

+0

添加'StringIO'是否改变结果?如果您尝试在运行Python代码的同一台计算机上的Web浏览器中加载该雅虎URL,您是否能够看到该网页? – bdesham

回答

1

如果您正在寻找解释,您可以立即停止阅读。另一方面,如果你寻求补救办法,那么可能就是这样。

>>> page = requests.get('http://finance.yahoo.com/q?s=IVV').text 
>>> lxml.etree.fromstring(page) #fails 
>>> tree = lxml.etree.fromstring(page, parser=lxml.etree.HTMLParser()) 
>>> tree.xpath('.//table[@class="W(100%)"]') 
[<Element table at 0x607dc08>] 

总之,使用requests页面获取一个字符串,解析字符串lxml,并继续像往常一样。

编辑:此代码将运行之前,您将需要import requestsimport lxml.etree

+0

谢谢比尔。我要添加的唯一警告是需要包括:导入请求 – GC123

+0

如果您要解释实际问题以及您的代码如何解决问题,这对OP和其他人来说将是一个非常有用的答案。 – bdesham

+0

@bdesham:我多么希望我能! –