【问题标题】:trying to select precedent nodes using lxml xpath尝试使用 lxml xpath 选择先例节点
【发布时间】:2016-05-04 10:26:07
【问题描述】:

我正在尝试获取当前选定节点的前同级,但不确定我做错了什么。

这是 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>
"""

如果href包含ASIN,我想得到的是rankNumber: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

【问题讨论】:

    标签: python xslt xpath lxml


    【解决方案1】:

    您可以使用以下 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

    【讨论】:

    • 太棒了,为什么没有“。”我想到了坚持当前元素的字符:(。是的 ('//div[@class="zg_itemImmersion"][.//div[@class="zg_itemImageImmersion"]/a[contains(@href,"B000AUIFCA ")]]//span[@class="zg_rankNumber"]/text()') 确实返回“10”。谢谢@har07
    • 我也很想知道,是否也可以使用 -preceeding-sibling 来完成?
    • 是的,如果 preceeding-sibling 使用正确。请注意preceding-sibling 只考虑 siblings,即共享相同父元素的节点 f.e 'zg_rankDiv' 是 'zg_itemWrapper' 的前一个兄弟。对于具有不同父级的元素,请尝试仅使用 preceding 轴。
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 2013-04-25
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多