2014-10-02 5 views
0
parser = etree.HTMLParser() 
tree = etree.parse(StringIO(input), parser) 

for target in tree.findall("//tr[@class='error']"): 
print target.tail 

Я хочу, чтобы выполнить код выше на ли это принести все после trclass="error"id="Testcase_5">Элемент дерева: .tail() всегда возвращает NONE

<tr class="error" id="Testcase_5"><td><a href="blabla">Hello</a></td><td>test</td><td>test</td> <td>test</td><td>Failed</td><td></td><td></td></tr> 

Однако все я не NONE

ответ

0

tail, по определению от lxml, является:

Текст, который непосредственно следует s элемент, к следующему элементу в дереве XML

Поскольку ваш tr класс не имеет какой-либо текст за <tr> .... </tr> и мы только один элемент, он возвращает None.

Скажем input является:

'<tr class="error" id="Testcase_5"><td><a href="blabla">Hello</a></td><td>test</td><td>test</td> <td>test</td><td>Failed</td><td></td><td></td></tr>i am the tail' 

, то выход будет i am the tail


Возвращаясь к вашему вопросу, если вы хотите, чтобы извлечь весь текст внутри <tr> узла вы могли бы что-то вроде этого:

parser = etree.HTMLParser() 
tree = etree.parse(StringIO(input), parser) 

for target in tree.findall(".//tr[@class='error']"): 
    #print target.tail 
    print target.xpath("//text()") 

Это будет печатать:

['Hello', 'test', 'test', ' ', 'test', 'Failed'] 

Проверить lxml docs