2016-12-28 12 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) 

Печать:

['Author 1', 'Author 2'] 
['Translator 1', 'Translator 2'] 

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

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