在同一节点选择元素

2024-03-29 12:56:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在,我需要餐厅的元素列表并执行一些操作。同样适用于酒吧、购物、咖啡。你知道吗

问题是lh和li处于同一节点级别。你知道吗

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

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

我也经历了一些有用的Concept XML XLST preceding-sibling and ancestor。但是,我们还没有找到解决办法

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>

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


Tags: id元素示例titlestylehtmlliul
2条回答

您可以执行以下操作:

  • 迭代“list header”元素
  • 对于每个“list header”,获取下面的同级并收集“tags”(将这些li元素文本命名为“tags”),直到满足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)

我在会话中运行了一些javascript,将在下面的每个列表项(LI)中添加一个名为列表头(LH)的自定义属性,因此需要根据需要更改自定义属性名,而不会与当前属性冲突。你知道吗

my_js = """let currentLh;
document.querySelectorAll(arguments[0]).forEach(function (elem) {
    if (elem.tagName === "LH") {
        currentLh = elem.textContent.toLowerCase();
    } else {
        elem.setAttribute("my-custom-attr", currentLh);
    }
"""

driver.execute_script(my_js, 'ul#searchresults > *')
my_restaurant_list = driver.find_elemets_by_css_selector('li[my-custom-attr="restaurant"]')
my_bar_list = driver.find_elemets_by_css_selector('li[my-custom-attr="bars"]')
my_shopping_list = driver.find_elemets_by_css_selector('li[my-custom-attr="shopping"]')
my_coffee_list = driver.find_elemets_by_css_selector('li[my-custom-attr="coffee"]')

这使用了JS NodeList.forEach函数,这在所有浏览器中可能都不可用,如果您在那里发现问题,则必须为无序列表中的所有元素找到一个更便于移植的循环解决方案。你知道吗

相关问题 更多 >