检查Xpath是否存在

2024-10-03 04:30:26 发布

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

我目前正在使用selenium、bs4和python进行抓取,但是在检查Xpath是否存在时遇到了一个问题,下面是我的代码:

def hasXpath(xpath):
    try:
        browser.get(quote_page) 
        self.browser.find_element_by_xpath(xpath)
        return True
    except:
        return False                          

# IF PRICELIST EXISTS CONDITION/    

if hasXpath("(//div[@id='product-header h4']//span)[last()-2]") or hasXpath("(//div[@id='product-header']//span)[last()-1]") or hasXpath("(//div[@id='product-header']//span)[last()]"):
    #No. of Items Per Retail(NEED LOGIN)
    somthing = browser.find_element_by_xpath("(//div[@id='product-header']//td)[21]").get_attribute("innerText")
    print(somthing)

    #Retail Price(NEED LOGIN)
    browser.get(quote_page)
    somthing1 = browser.find_element_by_xpath("(//div[@id='product-header']//span)[last()]").get_attribute("innerText")
    print(somthing1)


    if hasXpath("(//div[@id='product-header']//span)[last()-1]"):

       #1No. of Items Per Retail(NEED LOGIN)
       something = browser.find_element_by_xpath("(//div[@id='product-header']//td)[19]").get_attribute("innerText")
       print(something)

       #1Retail Price(NEED LOGIN)
       browser.get(quote_page) 
       something = browser.find_element_by_xpath("(//div[@id='product-header']//span)[last()-1]").get_attribute("innerText")
       print(something1)
else:
  print("It didn't go inside")

如您所见,它有一个简单的函数hasXpath(),我在它下面的IF语句中为条件传递xpath。然而,当我测试它时,一切似乎都指向else语句。我也试着把真实的情况加倍,但没有运气。我在实施这一点时做错了什么?在


Tags: divbrowseridgetbyelementfindproduct
1条回答
网友
1楼 · 发布于 2024-10-03 04:30:26

问题

您似乎使用了一个不存在的变量:self。(至少,您的代码片段中没有任何内容表明它可能存在或者这些可能是实例方法。)

如果删除包装try: ... except: ...,我敢打赌您会看到以下错误:

NameError: name 'self' is not defined

解决方案

假设定义了browser,只需删除{}。在

好处1:更好的异常处理

一般来说,您应该:

  • 尽可能缩小预期失败的范围(包括在try:块中的内容)和
  • 在处理哪些异常时尽可能具体。在

在您的例子中,看起来您只想保护find_element_by_xpath(),而只想捕获硒的{}:

^{pr2}$

这种特殊性会使使用self引起的NameError膨胀到您可能看到的位置,从而省去了在此处发布问题的麻烦。在

额外收获2:更高效的页面加载

调用browser.get(quote_page)多达六次:在脚本主体中调用两次;在^{函数中调用一次,调用四次。在

因为您总是加载同一个页面,所以只需在脚本开始时加载一次。在

相关问题 更多 >