【问题标题】:Xpath node-set nesting order selectionXpath 节点集嵌套顺序选择
【发布时间】:2021-04-09 23:27:14
【问题描述】:

是否有一个 Xpath 1.0 表达式,我可以从 div[@id='rootTag'] 上下文开始根据嵌套的深度选择不同的嵌套跨度后代? 例如,您是否可以使用 span[2] 之类的东西来选择嵌套最深的 span 标签,而不是同一父元素的第二个 span 子标签?

<div id='rootTag'>
    <span>Test</span>
    <div>   
       <span>Test</span>
       <span>Test</span>
    </div>
   </div>  
       <span>Test</span>
   </div>
   <div>  
     <div>
       <div>  
           <div>
              <span>Test</span>
           </div>
             <span>Test</span>
        </div>
     </div>
    </div>
</div>

【问题讨论】:

    标签: html selenium xpath


    【解决方案1】:

    这有点(很多......)hack,但可以通过这种方式完成:

    假设你的 html 是这样的:

    levels = """<div id='rootTag'>
      <span>Level2</span>
      <div>   
        <span>Level3</span>
        <div>
         <span>Level4</span>
        </div>
      </div>
      <div>  
        <span>Level3</span>
      </div>
      <div>  
        <div>
          <div>  
            <div>
              <span>Level6</span>
            </div>
            <span>Level5</span>
          </div>
        </div>
      </div>
    </div>"""
    

    然后我们这样做:

    #First collect the data:
    from lxml import etree #you have to make sure your html is well-formed, or it won't work
    root = etree.fromstring(levels)
    tree = etree.ElementTree(root)
    
    #collect the paths of all <span> elements
    paths = [tree.getpath(e) for e in root.iter('span')]
    
    #determine the nesting level of each <span> element
    nests = [e.count('/') for e in paths] #or, alternatively:
    #nests = [tree.getpath(e).count('/') for e in root.iter('span')]
    

    从这里开始,我们使用nests 列表中的嵌套级别来提取paths 列表中的可比较元素。例如,要获取嵌套级别最深的&lt;span&gt; 元素:

    deepest = nests.index(max(nests))
    print(paths[deepest],root.xpath(paths[deepest])[0].text)
    

    输出:

    /div/div[3]/div/div/div/span Level6
    

    或者提取具有 4 级嵌套的 &lt;span&gt; 元素:

    print(paths[nests.index(4)],root.xpath(paths[nests.index(4)])[0].text)
    

    输出:

    /div/div[1]/div/span Level4
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多