Python XPath 结果只显示 []

1 投票
3 回答
878 浏览
提问于 2025-04-15 15:46

嘿,我最近刚开始使用Python,想用它来做一些xPath的操作。问题是,当我打印查询的结果时,只得到一个空列表[],我不知道为什么 =S

    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文档?因为我觉得那个文档实在是太让人困惑了 =S


编辑

我修改了代码,现在得到的结果比之前的空列表多了一些内容,这些内容应该和我尝试解析的HTML不合法有关(但那不是我的,所以我不能修改它)。有没有什么办法可以让Python对这个问题宽容一些呢?

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

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

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

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

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

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

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

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

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

^ 实体:第3552行:解析错误: 标签html的数据过早结束 第3行

^ 回溯(最近的调用在前): 文件 "C:\Python26\lib\site-packages\libxml2.py", 第1263行,在parseDoc中 如果ret是None:抛出parserError('xmlParseDoc()失败') libxml2.parserError: xmlParseDoc() 失败

其实还有更长的错误列表,但放在这里没什么意义,因为所有错误都是由于HTML不合法造成的。

3 个回答

0

你是不是把和搞混了?把你的改成试试。

0

顺便提一下:你在XPath中那些不必要的复杂性是从哪里来的呢?比如这个:

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

其实和这个是一样的:

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

而且很可能还等同于这个:

//th/td[2]//a
1

可能是因为你的XPath没有选中任何元素。例如,你在寻找里面的,但这两个元素是平级的,不应该嵌套在一起。

你为什么说(count(preceding-sibling::*) + 1) = 2而不是count(preceding-sibling::*) = 1呢?

如果你使用一个更简单的XPath,结果是否符合你的预期呢?

撰写回答