Python/xpath を使用してフォーラムを phpbb3 に移行しようとしています。私はPythonとxpathにかなり慣れていませんが、うまくいっています。ただし、エラーのヘルプが必要です。
(ソースファイルはダウンロードして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が間違っていれば、このエラー全体が理にかなっています。ただし、他のすべてのファイルと、このファイル内の最初の数のユーザーは機能します。position()=11 にあるのはこの「1」だけです
position() は 10 を超えることはできませんか? 私はそうは思わない?何か不足していますか?