【发布时间】:2013-08-03 00:20:01
【问题描述】:
我正在尝试使用 python/xpath 将论坛迁移到 phpbb3。尽管我对 python 和 xpath 还很陌生,但进展顺利。但是,我需要帮助解决一个错误。
(source file 已下载并使用 tagoup 处理。)
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 ?我不这么认为? 我错过了什么吗?
【问题讨论】:
-
这可能无法解决您的问题,我只是在胡乱猜测,但我注意到您指的是位置 11,而该页面上只有 10 条记录。
-
此外,我在使用 xpath 时也遇到了一些问题,所以我决定尝试 PyQuery,它是 Python 的 jQuery 等价物,并且效果很好。您可以使用选择器,这将使您更轻松地提取信息。
-
我建议使用
lxml.html而不是lxml.etree来解析有问题的html 文件。至于错误,请尝试使用html.tostring打印导致错误的帖子,看看它是否真的具有您期望的结构,最终将结果发布在这里。另外,我看到您使用的是绝对 xpath,您甚至可以尝试在提取信息的 xpath 前加上“//”,以防有问题的帖子周围有包装元素,它也可以在其中找到信息。 -
@miguelcaires 是的,该页面上有 10 个“帖子”,但是 tr[position()=2] 是帖子 #1,position()=11 是汤普森的帖子 #10惹麻烦
-
正如@andrean 所建议的,用
lxml.html解析对我有用:import lxml.html然后lxml.html.parse("http://www.razyboard.com/system/morethread-alte-korken-fruchtweinkeller-89069-6046822-0.html")。我可以使用您的其余代码和 XPath 表达式打印所有用户名。
标签: python xpath lxml attributeerror nonetype