用于使用 selenium 循环 JS 路径选择器

Posted

技术标签:

【中文标题】用于使用 selenium 循环 JS 路径选择器【英文标题】:for looping a JS path Selector using selenium 【发布时间】:2022-01-10 01:25:27 【问题描述】:

代码:

def page_function():
    driver.get('https://www.se.com/us/en/product-range/63426-powerlogic-accusine-pcs%2B/?N=4176697776&No=12&Nrpp=12')
    driver.maximize_window()
    # gets the amount of items in the search bar
    print("Number of products:", 69)
    # for loop to read the product name and descriptions

    # product = driver.find_element(By.CSS_SELECTOR, ".search-item")
    # product = product.text
    # print(product)
    pr = "]/product-card//article/div/div[2]/div[1]/pes-product-price/p/span[1]"
    nam = "]/product-card//article/div/div[1]/product-card-main-info//div/pes-router-link[1]/a"
    des = ') > product-card").shadowRoot.querySelector("product-card-main-info.hydrated").shadowRoot.querySelector("pes-router-link.description.hydrated a > h3")'

    # des_path = "#search-items > .search-item .details > a > .row.pt-5.pb-sm-5 > .multilines-3.text-truncate-multilines.xs-single-col-8.col-12 > .font-weight-bold.text-dark"
    follow_loop = range(1, 70)
    for x in follow_loop:
        y = x
        if (x > 61):
            y = x - 60
        elif (x > 49):
            y = x - 48
        elif (x > 37):
            y = x - 36
        elif (x > 25):
            y = x - 24
        elif(x > 13):
            y = x - 12
        else:
            print("")
        if ( ((x % 13) == 0) ):
            driver.delete_all_cookies()
            next_arrow = driver.find_element(By.CLASS_NAME, "page-links__arrow page-links__arrow--next js-page-link js-page-link-next")
            driver.execute_script("arguments[0].click();", next_arrow)

        xpath += "return document.querySelector("product-cards-wrapper.hydrated").shadowRoot.querySelector("div > ul > li:nth-child(str(y)) > product-card )
        xpath += str(y)
        xpath += des
        xpath += "'"
        driver.implicitly_wait(10)
        description.append(driver.execute_script(xpath))
        print(description[x].text)
        input("continue??")
        xpath2 = xpath.replace(des, '')
        xpath2 += pr
        unit_price.append(driver.find_element(By.XPATH, xpath2).text)
        xpath3 = xpath2.replace(pr, '')
        xpath3 += nam
        name.append(driver.find_element(By.XPATH, xpath3).text)

错误:

File "C:\Users\....\Documents\web_scrap\main.py", line 65, in page_function
    xpath += 'return document.querySelector("product-cards-wrapper.hydrated").shadowRoot.querySelector("div > ul > li:nth-child('
UnboundLocalError: local variable 'xpath' referenced before assignment

网页: Website

问题:

目前,借助堆栈溢出中的其他人的帮助,能够从影子根中识别出他们产品网站上的描述、价格和产品名称。因此,我需要使用 execute_script() 命令才能工作。此外,我能够看到每个元素都只是在不同的 dif 类中,这是我在这段代码中尝试做的。但是,这似乎不起作用。有什么想法吗??

谢谢

【问题讨论】:

【参考方案1】:
xpath += "return document ...

一样
xpath = xpath + "return document

但是您还没有定义它,这就是您收到错误'xpath' referenced before assignment 的原因,您可能只想拥有:

xpath = "return document.querySelector('product-cards-wrapper.hydrated').shadowRoot.querySelector('div > ul > li:nth-child(str(y)) > product-card')"

【讨论】:

感谢您的回复,我能够使用您的信息和输入来调整代码以使其正常工作!但是,您是否偶然知道任何可以帮助我更好地理解数据结构和 python 的资源。谢谢!

以上是关于用于使用 selenium 循环 JS 路径选择器的主要内容,如果未能解决你的问题,请参考以下文章

Selenium CSS 选择器,用于第 n 次出现 td span:nth-child(2)

如何解决硒循环中的这个错误? InvalidSelectorException:消息:无效选择器:无法使用 xpath 定位元素

selenium

selenium之css定位小结

使用 Selenium 提取元素的 CSS 选择器

无法使用 Selenium 中的 CSS 选择器选择同级