【问题标题】:XPATH syntax for element in {} with Selenium for Python{} 中元素的 XPATH 语法与 Selenium for Python
【发布时间】:2021-10-16 05:27:02
【问题描述】:

我目前正在尝试使用 Python 中的 Selenium 单击网页上的每个按钮,每个按钮的类和文本始终相同,但每个按钮都有不同的 id。但是,ID 在 {} 中的“数据参数”内,我无法弄清楚如何获得 xpath 的正确语法。 这是其中一个按钮的网站 sn-p:

<span class="contains-icon-details gc-btn gc-btn--s" data-isneededpromise="false" data-parameters="{"partner":"gs", "realId": "8da1d6a9-44d1-4556-bc12-92699749a30a", "tnId": "102086182829", "type": "details"}">More Details</span>

realId 和 tnId 似乎是唯一的,所以我需要找到其中任何一个的按钮。

这行得通:

driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']").click()

但当然只适用于第一个按钮,因为类始终相同。

我尝试过这样的事情:

driver.find_element_by_xpath("//*[contains(@tnId, '102086182829')]").click()

但我明白了

Unable to locate element: //*[contains(@tnId, '102086182829')]

所以绝对不是正确的语法。

我试图在网上找到解决方案,但到目前为止没有运气。谁能指出我正确的方向?提前致谢。

【问题讨论】:

    标签: python selenium web-scraping xpath selenium-firefoxdriver


    【解决方案1】:

    您应该按“数据参数”属性进行过滤。

    试试

    driver.find_element_by_xpath("//span[contains(@data-parameters, '102086182829')]").click()
    

    这是你需要的一个肮脏的实现。最好提取data-parameters字段,反序列化JSON并检查需要的字段;

    spans = driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']")
    for span in spans:
        data_parameters = span.get_attribute("data-parameters")
        try:
            data_parameters = json.loads(data_parameters)
        except:
            continue
    
        if 'tnId' in data_parameters and data_parameters['tnId'] == "102086182829":
            span.click()
            break
    

    【讨论】:

    • 感谢您的额外实施,这是有道理的。我接受了先知的回答,因为他是我看到的第一个有效的解决方案。我会给你一个赞成票,但由于我的声誉低,我不能,对不起。现在我只需要了解如何在新标签中打开链接...
    【解决方案2】:

    如果 realId 值或 tnId 值是唯一的,您的 XPath 可以是

    driver.find_element_by_xpath("//*[contains(@data-parameters, '8da1d6a9-44d1-4556-bc12-92699749a30a')]").click()
    

    driver.find_element_by_xpath("//*[contains(@data-parameters, '102086182829)]").click()
    

    【讨论】:

    • 太棒了,这就是我一直在寻找的东西,而且它有效。为什么此语句中的“@realId”和“@tnId”已过时?它只是在 {} 中寻找任何匹配项吗?
    • 所有这些都是长 data-parameters 属性值的一部分,它们本身不是元素属性。
    猜你喜欢
    • 2021-05-02
    • 2019-11-06
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多