2 回答

TA貢獻(xiàn)2037條經(jīng)驗 獲得超6個贊
網(wǎng)站是用(通常是無效的)HTML而不是XML編寫的。您不應(yīng)該將HTML視為XML。
使用lxml的HTML解析器,您的問題應(yīng)該消失了:
import urllib2
from lxml import etree
parser = etree.HTMLParser()
tree = etree.parse(urllib2.urlopen(url), parser)
如果您發(fā)現(xiàn)在嘗試讀取無效的HTML時lxml仍然阻塞,那么您將不得不找到一個更寬松的解析器。html5libBeautifulSoup的使用是Python中最寬松(也是最慢)的HTML解析器:
from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen(url), 'html5lib')

TA貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊
我還遇到一個問題,即lxmliterparse()
有時會AttValue: ' expected
以非常不可預(yù)測的模式拋出。我知道我要發(fā)送的XML是有效的,并且重新運(yùn)行相同的腳本通常會使它工作(或者在完全不同的地方失敗)。
最后,我設(shè)法創(chuàng)建了一個可以重新運(yùn)行的測試用例,它會立即完成或AttValue
在看似隨機(jī)的結(jié)果中引發(fā)錯誤。這是我做錯的事情:
我輸入的iterparse()
是我自己編寫的類似文件的對象(我正在處理來自請求的HTTP響應(yīng)流,但必須先將其解壓縮)。編寫read()
方法時,我作弊并忽略了size參數(shù)。相反,我只是解壓縮一塊固定大小的壓縮字節(jié),然后返回解壓縮后的字節(jié)序列,通常比32k lxml請求要多得多!
我懷疑這會導(dǎo)致lxml內(nèi)部某個地方的緩沖區(qū)溢出,從而導(dǎo)致上述問題。一旦我停止返回比lxml請求的字節(jié)更多的字節(jié),這些隨機(jī)錯誤就會消失。
添加回答
舉報