首页 > 解决方案 > 选择同一节点的元素

问题描述

我正在用 Python 编写 Selenium 自动化脚本。作为一个过程,我需要收集一些元素。下面是示例 html(我进行了编辑以使其看起来很简单)。当我执行搜索时,我得到类似于下面的搜索结果。

现在,我需要餐厅中的元素列表并执行一些操作。酒吧、购物、咖啡也是如此。

事情是 lh 和 li 处于同一节点级别。

我尝试了以下 xpath,但它只选择 lh 元素

//ul[@id='searchresults']//ancestor::lh

我还阅读了有用的 Concept XML XLST 前兄弟和祖先。但是,还没有想出解决办法

示例 html 代码:

<ul id="searchresults">
    <lh style="">Restaurants</lh>
    <li title="Chamber"><span>Chamber</span></li>
    <li title="Chillies"><span>Chillies</span></li>
    <li title="Sushi Ville"><span>Sushi Ville</span></li>
    <li title="Toasters"><span>Toasters</span></li>
    <li title="Joe Grills"><span>Joe Grills</span></li>
    <lh style="">Bars</lh>
    <li title="Y Cocktails"><span>Y Cocktails</span></li>
    <li title="Z Brewery"><span>Z Brewery</span></li>
    <li title="X Drinks"><span>X Drinks</span></li>
    <lh style="">Shopping</lh>
    <li title="Pacific"><span>Pacific</span></li>
    <li title="Spencers"><span>Spencers</span></li>
    <li title="Hays"><span>Hays</span></li>
    <lh style="">Coffee</lh>
    <li title="Roasters"><span>Roasters</span></li>
    <li title="Coffee Beans"><span>Coffee Beans</span></li>
    <li title="Coffee Cafe"><span>Coffee Cafe</span></li>
</ul>

非常感谢您的帮助,请让我知道我缺少或需要的任何信息,这将有助于解决这个问题。

标签: pythoncssseleniumselenium-webdriverxpath

解决方案


您可以执行以下操作:

  • 遍历“列表标题”元素
  • 对于每个“列表标题”,​​获取以下兄弟并收集“标签”(我们将这些li元素文本命名为“标签”),直到lh遇到兄弟

这些方面的东西:

for lh in driver.find_elements_by_xpath("//ul[@id='searchresults']//lh"):
    restaurant = lh.text

    tags = []
    for element in lh.find_elements_by_xpath("./following-sibling::*"):
        if element.tag_name == 'lh':
            break

        tags.append(element.text)

    print(restaurant, tags)

推荐阅读