2016-12-28 105 views
1

enter image description here选择和修改的XPath节点

我使用此代码来获取所有的名字:

def parse_authors(self, root): 
    author_nodes = root.xpath('//a[@class="booklink"][contains(@href,"/author/")]/text()') 
    if author_nodes: 
     return [unicode(author) for author in author_nodes] 

但我想,如果有任何翻译添加“(译)”旁边的名称:

example:translator1(translation) 

回答

2

您可以使用translation:文本节点从译者区分作者 - 作者是“翻译:”文本节点的前面兄弟姐妹,翻译者 - 跟随兄弟姐妹。

著者:

//text()[contains(., 'translation:')]/preceding-sibling::a[@class='booklink' and contains(@href, '/author/')]/text() 

翻译:

//text()[contains(., 'translation:')]/following-sibling::a[@class='booklink' and contains(@href, '/author/')]/text() 

工作示例代码:

from lxml.html import fromstring 

data = """ 
<td> 
    <a class="booklink" href="/author/43710/Author 1">Author 1</a> 
    , 
    <a class="booklink" href="/author/46907/Author 2">Author 2</a> 
    <br> 
    translation: 
    <a class="booklink" href="/author/47669/translator 1">Translator 1</a> 
    , 
    <a class="booklink" href="/author/9382/translator 2">Translator 2</a> 
</td>""" 

root = fromstring(data) 

authors = root.xpath("//text()[contains(., 'translation:')]/preceding-sibling::a[@class='booklink' and contains(@href, '/author/')]/text()") 
translators = root.xpath("//text()[contains(., 'translation:')]/following-sibling::a[@class='booklink' and contains(@href, '/author/')]/text()") 

print(authors) 
print(translators) 

打印:

​​