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 只有这个“一个”

position() 不能 >10 吗?我不这么认为?我错过了什么吗?

4

1 回答 1

1

问题已回答!

我已经找到答案了...

当我试图修复它并来这里寻求帮助时,我一定很累。我没有看到很明显的东西......

我发布问题的方式也不可见。

  • 我下载并使用 tagsoup 处理的 HTML 在位置 11 处有一个附加标签...这在网站上不可见并且与我的 xpath 搞砸了(它可能是论坛生成的糟糕 html 结合 tagoups 试图使其可解析)在> 20000个文件中不到20个受到影响,这里的这个恰好是第一个......

  • 此外,有时信息在表 [4] 中,有时在表 [5] 中。我确实考虑了这一点并编写了一个函数来确定正确的表。尽管我对该功能进行了很多测试并认为它可以正常工作(因此没有包括在上面),但事实并非如此。所以我做了一个更好的xpath:

    '/html/body/table[tr/td[@width="20%"]]/tr[position()>1]'

并且,虽然这不相关,但我在 html 文件(不是 utf-8)中遇到了另一个问题,该问题通过添加以下内容得到修复:

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

我现在确信,在调整了奇怪的附加和多个 , 和标签后,我的代码将适用于所有文件......

我仍然会研究 lxml.html,正如我在评论中提到的那样,我以前从未使用过它,但如果它更健壮并且可以允许使用没有 tagoup 的文件,它可能更适合并为我节省大量时间try/except 语句和循环来修复与我当前脚本有关的几个文件...

于 2013-08-04T20:03:59.697 回答