【问题标题】:python lxml xpath AttributeError (NoneType) with correct xpath and usually workingpython lxml xpath AttributeError(NoneType)具有正确的xpath并且通常可以工作
【发布时间】: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


【解决方案1】:

问题已回答!

我找到了答案……

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

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

  • 我下载并使用 tagoup 处理的 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 语句和循环,以修复与我当前脚本有关的少数文件...

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2021-10-24
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多