2013-08-03 101 views
0

我想通過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?我不這麼認爲? 我錯過了什麼嗎?

+0

這可能無法解決您的問題,我只是猜測,但我注意到,你指的是位置11 ,當你在該頁面上只有10條記錄時。 – miguelcaires

+0

另外,我也遇到了xpath的一些問題,所以我決定嘗試PyQuery,這是Python對jQuery的等價物,它工作得很好。你可以使用選擇器,這將使你的生活方式更容易提取信息。 – miguelcaires

+0

我推薦使用'lxml.html'而不是'lxml.etree'來解析相關的html文件。至於錯誤,請嘗試使用'html.tostring'打印引起錯誤的帖子,看它是否真的具有你期望的結構,最終在這裏發佈結果。另外,我看到你正在使用絕對路徑,你甚至可以嘗試在用'//'提取信息的xpaths前綴,以防有問題的帖子周圍有一個包裝元素,它也可以找到它的信息。 – andrean

回答

1

已回答問題!

我已經找到了答案......

我一定已經很累了,當我試圖修復它,來到這裏尋求幫助。我沒有看到相當明顯的東西...

我發佈我的問題的方式,它也不可見。

  • 我下載並使用tagsoup處理的HTML有一個額外的標籤在第11位......這不是在網站上顯示並與我的XPath 擰緊(這可能是通過在組合論壇生成HTML蹩腳與tagsoups試圖使其可解析) 出小於20> 20000個文件被折磨,這在這裏一個正好是第一......

  • 另外有時信息是在表[4],其他時間在表[5]中。我爲此做了解釋並編寫了一個函數來確定正確的表格。雖然我測試了很多功能,並認爲它正常工作(因此沒有包含在上面),但它沒有。 所以我取得了較好的xpath:

    '/ HTML /體/表[TR/TD [@寬度= 「20%」]]/TR [位置()> 1]'

並且,雖然這是沒有關係的,我遇到了與在HTML文件中unxpected編碼(非UTF-8),這是固定的另一個問題通過添加:

parser = etree.XMLParser(encoding='ISO-8859-15') 
t = etree.parse(forumfile, parser) 

我現在相信,在調整了奇怪的附加和後多個和標籤我的代碼將適用於所有文件...

我仍然會關注lxml.html,正如我在評論中提到的,我從來沒有使用過它,但如果它更健壯並且可以允許在沒有tagsoup的情況下使用這些文件,它可能更適合並保存我廣泛的嘗試/除了語句和循環來修復幾個文件擰與我目前的腳本...