2016-05-04 2 views
0

Я пытаюсь получить предыдущий-братьев текущего выбранного узла, но не уверен, что я делаю неправильно.пытается выбрать узлы прецедента, используя lxml xpath

Это HTML оснастки:

source = """ 
    <div class="zg_itemImmersion"> 
    <div class="zg_rankDiv"><span class="zg_rankNumber">10.</span></div> 
    <div class="zg_itemWrapper" style="height:285px"> 
     <div class="zg_image"> 
      <div class="zg_itemImageImmersion"><a href=" 
      http://www.amazon.com/Oral-B-Action-Replacement-Electric-Toothbrush/dp/B000AUIFCA/ref=zg_mw_8517148011_10"><img src="http://ecx.images-amazon.com/images/I/41RHKIQXnhL._SL160_SL150_.jpg" alt="Oral-B Floss Action Replacement Elect..." title="Oral-B Floss Action Replacement Elect..."/></a></div> 
     </div> 
    </div> 
""" 

Что я пытаюсь получить это rankNumber если HREF содержит ASIN: B000AUIFCA,

from lxml import html 
source1 = html.fromstring(source) 
links = source1.xpath('//div[@class="zg_itemImmersion"]//div[@class="zg_itemImageImmersion"]/a[contains(@href,"B000AUIFCA")]/@href') 

выше дает мне право на ссылку, которая содержит мой нужен ASIN: B000AUIFCA

['\n\n\n\n\n\n\nhttp://www.amazon.com/Oral-B-Action-Replacement-Electric-Toothbrush/dp/B000AUIFCA/ref=zg_mw_8517148011_10/191-4138574-0525467'] 

Теперь я хочу иметь звание "10" из-собрата, предшествующего - [span class="zg_rankNumber"] если ASIN в ('//span[@class="zg_rankNumber"]//a//@href') == B000AUIFCA

для этого я использую: link2 = source1.xpath('//div[@class="zg_itemImmersion"]//div[@class="zg_itemImageImmersion"]/a[contains(@href,"B000AUIFCA")]/preceding-sibling::*/text()')

но его возвращение Null

ответ

2

Вы можете использовать следующие XPath:

//div[@class="zg_itemImmersion"] 
    [.//div[@class="zg_itemImageImmersion"]/a[contains(@href,"B000AUIFCA")]] 
//span[@class="zg_rankNumber"] 

XPath сначала найти 'zg_itemImmersion' div, который содержит целевой текст «ASIN: B000AUIFCA». Затем из таких div, 'zg_rankNumber' span возвращается.

+0

Это было потрясающе, почему не было "." персонаж, прилипающий к текущему элементу, пришел в мой разум :(Да ('//div[@class="zg_itemImmersion"][.//div[@class="zg_itemImageImmersion"]/a[contains(@href,"B000AUIFCA "]]] // span [@ class =" zg_rankNumber "]/text() ') возвращает" 10. "Спасибо @ har07 –

+0

Мне также интересно узнать, можно ли это сделать, используя - preceeding-sibling ? –

+0

Да, если 'preceeding-sibling' используется правильно. Обратите внимание, что' previous-sibling' учитывает * siblings *, то есть узлы, которые имеют один и тот же родительский элемент fe 'zg_rankDiv', предшествующий родству «zg_itemWrapper». элементы с разными родителями попробуйте использовать только «предыдущую» ось. – har07

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