我想通過python/xpath將論壇遷移到phpbb3。雖然我對python和xpath很新,但它很順利。但是,我需要幫助解決一個錯誤。python lxml xpath AttributeError(NoneType)與正確的XPath,通常工作
(該source file已被下載,並與tagsoup處理。)
的Firefox/Firebug的顯示XPath的:/html/body/table[5]/tbody/tr[position()>1]/td/a[3]/b
(在我的腳本不TBODY)
這裏是我的代碼的縮寫版本:
forumfile="morethread-alte-korken-fruchtweinkeller-89069-6046822-0.html"
XPOSTS = "/html/body/table[5]/tr[position()>1]"
t = etree.parse(forumfile)
allposts = t.xpath(XPOSTS)
XUSER = "td[1]/a[3]/b"
XREG = "td/span"
XTIME = "td[2]/table/tr/td[1]/span"
XTEXT = "td[2]/p"
XSIG = "td[2]/i"
XAVAT = "td/img[last()]"
XPOSTITEL = "/html/body/table[3]/tr/td/table/tr/td/div/h3"
XSUBF = "/html/body/table[3]/tr/td/table/tr/td/div/strong[position()=1]"
for p in allposts:
unreg=0
username = None
username = p.find(XUSER).text #this is where it goes haywire
當循環在文件末尾敲擊用戶「tompson」/ position()= 11時,我得到
AttributeError: 'NoneType' object has no attribute 'text'
我已經嘗試了很多try except else finallys
,但他們是沒有幫助的。
我後來獲得了更多的信息在腳本中,如後期之日起,用戶註冊的日期,URL和分身屬性,該帖子的內容...
該腳本數百這個論壇的其他文件/網站。
這不是編碼/解碼問題。而且它不受XUSER部分的限制。我試圖「硬編碼」用戶名,那麼註冊表的日期將會失敗。如果我跳過這些,後的文本(代碼見下文)將失敗...
#text of getpost
text = etree.tostring(p.find(XTEXT),pretty_print=True)
現在,這整個錯誤將使意義,如果我的XPath將是錯誤的。但是,此文件中的所有其他文件和第一批用戶都可以工作。 ()= 11上的這個「one」()= 11
位置()是否不可進行> 10?我不這麼認爲? 我錯過了什麼嗎?
這可能無法解決您的問題,我只是猜測,但我注意到,你指的是位置11 ,當你在該頁面上只有10條記錄時。 – miguelcaires
另外,我也遇到了xpath的一些問題,所以我決定嘗試PyQuery,這是Python對jQuery的等價物,它工作得很好。你可以使用選擇器,這將使你的生活方式更容易提取信息。 – miguelcaires
我推薦使用'lxml.html'而不是'lxml.etree'來解析相關的html文件。至於錯誤,請嘗試使用'html.tostring'打印引起錯誤的帖子,看它是否真的具有你期望的結構,最終在這裏發佈結果。另外,我看到你正在使用絕對路徑,你甚至可以嘗試在用'//'提取信息的xpaths前綴,以防有問題的帖子周圍有一個包裝元素,它也可以找到它的信息。 – andrean