2013-08-03 104 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的情况下使用这些文件,它可能更适合并保存我广泛的尝试/除了语句和循环来修复几个文件拧与我目前的脚本...