2016-05-13 1 views
0

Это может быть очень простая вещь, но я продолжал ее терпеть.Получение n-го элемента с lxml/XPath не работает

Когда root содержит одну или несколько ссылок «<»/> «s, root.xpath ('(// link)') возвращает их все. Но root.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() 

ответ

3

Это потому, что индексация в XPath начинается с 1, а не 0:

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

Или, вы можете также получить элемент по индексу в Python (0 основе):

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

 Смежные вопросы

  • Нет связанных вопросов^_^