2017-06-06 878 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:我多麼希望我能! –