2016-05-13 18 views
0

これは非常に簡単なことかもしれませんが、失敗し続けました。lxml/XPathでn番目の要素の取得に失敗する

rootに1つ以上の "< link/>"が含まれている場合、root.xpath( '(// link)')はそれらをすべて返します。しかし、root.xpath( '(// link)[0]')は空のリストを返します。なにが問題ですか?

のXPathで インデックスは1、ない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() 

答えて

3

root.xpath('(//link)[1]') 

それとも、あなたも(0ベース)、Pythonでインデックスで要素を取得することができます:

root.xpath('//link')[0] 
関連する問題