使用lxml/XPath获取第n个元素失败

2024-04-28 11:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一件很简单的事情,但我一直未能成功。在

root包含一个或多个“<;link/>;”时,根.xpath('(//link)'返回所有这些值。但是根.xpath(“(//link)[0]”)返回空列表。怎么了?在

from unittest import TestCase, TestProgram

class T(TestCase):
    base_path = r'(//_:link)'
    def test0ok(self):
        self._test(2, self.base_path)
    def test1ng(self):
        self._test(1, self.base_path + r'[0]')
    def _test(self, expected, path):
        try:
            from lxml.etree import fromstring as parse_xml_string
        except ImportError:
            raise
        root = parse_xml_string(_xhtml)
        nsmap = dict(_=root.nsmap[None])
        gotten = root.xpath(path, namespaces=nsmap)
        gotten = len(gotten)
        self.assertEqual(expected, gotten)

_xhtml = br'''
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<link rev="made" href="./" />
<link rel="contents" href="./" />
<title>te</title>
</head>
<body>
<h1>st</h1>
</body>
</html>
'''[1:]

if __name__ == r'__main__':
    TestProgram()

Tags: pathfromtestimportselfbasedefhtml