1

嘿,我最近才开始使用 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 行:解析器错误:标记表第 207 行中的数据过早结束

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

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

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

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

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

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

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

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

它实际上是一个较长的列表,但将其全部放在这里是没有意义的,因为所有错误都是由于无效的 html 造成的。

4

3 回答 3

1

可能是您的 XPath 没有选择任何元素。例如,您正在 th 中寻找 td,但这些元素是对等的,不应嵌套。

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

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

于 2009-11-07T21:21:55.797 回答
0

你混淆了 th 和 tr 吗?将您的 th 更改为 tr。

于 2009-11-08T15:15:02.270 回答
0

旁注:XPath 中所有不必要的复杂性从何而来?这个:

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

相当于:

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

甚至很可能:

//th/td[2]//a
于 2009-11-09T10:33:24.103 回答