嘿,我最近刚开始使用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。
答案 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