Python XPath结果仅显示[]

时间:2009-11-07 21:10:37

标签: python xpath libxml2

嘿,我最近刚开始使用Python,我想用一些xPath来使用它,就是当我打印查询结果时我只得到[]并且我不知道为什么= S < / p>

    import libxml2, urllib


doc = libxml2.parseDoc(urllib.urlopen("http://www.domain.com/").read())
result = doc.xpathEval("//th//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//a")

if result != []:
    print result
elif result == "":
    print "null"
else:
    print result

doc.freeDoc()

我没有任何错误只是[]。会是什么呢? libxml2还有比here更好的文档,因为我发现它真的令人困惑= S


修改

我改变了代码,所以现在我得到的不仅仅是[]我得到以下输出,这应该与我试图解析的html的无效性有关(但它不是我的,所以我不能修改它)。关于如何告诉Python对这个事实更宽容的任何想法?

  

^实体:第3552行:解析器错误:   标记tr行中数据的过早结束   209

     

^实体:第3552行:解析器错误:   标签tbody中数据的过早结束   第208行

     

^实体:第3552行:解析器错误:   标签表中数据的过早结束   第207行

     

^实体:第3552行:解析器错误:   标签输入中数据的过早结束   第206行

     

^实体:第3552行:解析器错误:   标签输入中数据的过早结束   第205行

     

^实体:第3552行:解析器错误:   标签表单行中数据的过早结束   204

     

^实体:第3552行:解析器错误:   标签表中数据的过早结束   第99行

     

^实体:第3552行:解析器错误:   标签div行中数据的过早结束   98

     

^实体:第3552行:解析器错误:   标签主体行中数据的过早结束   96

     

^实体:第3552行:解析器错误:   标记html行中的数据提前结束   3

     

^ Traceback(最近一次调用最后一次):   文件   “C:\ Python26 \ LIB \站点包\ libxml2.py”   第1263行,在parseDoc中       如果ret为None:raise parserError('xmlParseDoc()failed')   libxml2.parserError:xmlParseDoc()   失败

它实际上是一个较长的列表,但没有必要将它放在这里,因为所有错误都是由于无效的html。

3 个答案:

答案 0 :(得分:1)

可能是您的XPath没有选择任何元素。例如,你正在寻找内部的td,但这些元素是同行的,不应该嵌套。

为什么说(count(preceding-sibling::*) + 1) = 2代替count(preceding-sibling::*) = 1

如果你使用更简单的XPath,你会得到你期望的结果吗?

答案 1 :(得分:0)

你是否混淆了th和tr?将你改为tr。

答案 2 :(得分:0)

旁注:XPath中所有不必要的复杂性来自哪里?这样:

//th//td[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//a

相当于:

//th//td[count(preceding-sibling::*) = 1)]//a

甚至很可能:

//th/td[2]//a