我想通过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?我不这么认为? 我错过了什么吗?
这可能无法解决您的问题,我只是猜测,但我注意到,你指的是位置11 ,当你在该页面上只有10条记录时。 – miguelcaires
另外,我也遇到了xpath的一些问题,所以我决定尝试PyQuery,这是Python对jQuery的等价物,它工作得很好。你可以使用选择器,这将使你的生活方式更容易提取信息。 – miguelcaires
我推荐使用'lxml.html'而不是'lxml.etree'来解析相关的html文件。至于错误,请尝试使用'html.tostring'打印引起错误的帖子,看它是否真的具有你期望的结构,最终在这里发布结果。另外,我看到你正在使用绝对路径,你甚至可以尝试在用'//'提取信息的xpaths前缀,以防有问题的帖子周围有一个包装元素,它也可以找到它的信息。 – andrean