0

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 を超えることはできませんか? 私はそうは思わない?何か不足していますか?

4

1 に答える 1