【问题标题】:Tag found but class not visible Python Selenium找到标记但类不可见 Python Selenium
【发布时间】:2021-08-25 10:55:35
【问题描述】:

我已经花费了 4 个多小时并数着数,试图获取一个在网页上可见但在我尝试使用 Selenium 抓取它时不会拉取的元素。我什至尝试将直接 xpath 复制到元素,但仍然无法正常工作。在我的浏览器上检查页面显示结构是这样的。

<div class="flex-deprecated flex-items-xs-center">
  <div>...<div>
  <div style="position:relative">
    <div class="row flex-xs-nowrap no-margin form-left form-box-container ">
      <div class="form-box flex-xs-no-grow cursor-pointer ">
        <svg class="margin-center">
          <rect class="form-in-shape"></rect>
          <text class="form-win-text">TEXT</text>
        </svg>
      </div>
      <div class="form-box flex-xs-no-grow cursor-pointer ">...</div>
      <div class="form-box flex-xs-no-grow cursor-pointer ">...</div>
      <div class="form-box flex-xs-no-grow cursor-pointer ">...</div>
      <div class="form-box flex-xs-no-grow cursor-pointer ">...</div>
      <div class="row flex-items-xs-middle form-arrow-line no-margin left">...</div>
    </div>
 </div>

TEXT 是我要抓取的内容,我可以使用 class="form-box flex-xs-no-grow cursor-pointer " 找到所有 5 个 div 标签,但是当我找不到 svg 标签或 text 标签时尝试使用直接 xpath,它会找到 text 标记,但返回空字符串,我尝试获取标记内的文本。 这是我的代码,因为我目前不知道如何解决这个问题。

z = driver.find_element_by_xpath("//div[@class='sub-container head-to-head']/div[3]/div/div[@class='panel margin-bottom ']/div/div[@class='row']")
        
        z1 = z.find_element_by_xpath(".//div[@class='col-xs-6']/div[@class='row']/div[@class='col-xs-12 col-sm-5 col-md-7 flex-deprecated flex-items-xs-middle flex-items-xs-center']/div/div[@class='visible-md-up hidden-xs-up']/div/div[@class='row']/div/div/div[2]/div[@class='row flex-xs-nowrap no-margin form-left form-box-container ']")
        z2 = z1.find_elements_by_xpath(".//div[@class='form-box flex-xs-no-grow cursor-pointer ']")
        
        try:
            for i_ in range(0, 5):
                ztemp1 = z2[i_].find_element_by_class_name("margin-center")
                wait.until(EC.presence_of_element_located((By.CLASS_NAME, "form-with-text")))
                #ztemp = ztemp1.find_elements_by_class_name("form-with-text")
                ztemp =ztemp1.find_element_by_tag_name("text")
                #print("TESTIN>>> {}".format(len(ztemp)))
                print("SKKKKKK>>>>> {}".format(ztemp.text))
                z3 = z2[i_].find_elements_by_xpath(".//*")
                
                print('good here {}'.format(len(z3)))
                
        except(NoSuchElementException):
            print('Tag or Class not found')

当我尝试按类名查找text 标签时,它没有找到它,但是当我按标签名称搜索时它找到了它,但它是一个空字符串。这是我正在使用的网站的链接 [Source Site][1]

任何帮助和提示将不胜感激。 [1]:https://s5.sir.sportradar.com/betking/en/1/season/83706/headtohead/17/42/match/27751100

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    这是一个 svg 元素。你可以这样定位:

    //*[name()='svg' and @class='margin-center']//*[name()='text']
    

    这给了我 66 个网络元素。

    你可以像下面这样循环:

    driver = webdriver.Chrome(driver_path)
    driver.maximize_window()
    driver.implicitly_wait(50)
    driver.get("https://s5.sir.sportradar.com/betking/en/1/season/83706/headtohead/17/42/match/27751100")
    
    for txt in driver.find_elements(By.XPATH, "//*[name()='svg' and @class='margin-center']//*[name()='text']"):
      print(txt.text)
    

    【讨论】:

    • 对不起,我应该提到,svg 元素有两个不同的类别,一个是 home,一个是 away,当你打开网站时,它会像这样显示它们,我应该刮一下它们像那样分开,但是如果我在页面中获得整个 svg,那么我将无法分辨哪个是哪个。
    • 是的,在这种情况下,您可以有两个带有两个 find_elements 的列表,您是否也需要帮助?
    • 我应该能够弄清楚,谢谢。
    • 请记住,这是查找 svg 标签的方法,//*[name()='svg'] 您可以放置​​和 @class 或任何其他属性来匹配您要抓取的节点。
    【解决方案2】:

    你也可以试试这个:

    driver.implicitly_wait(10)
    driver.get("https://s5.sir.sportradar.com/betking/en/1/season/83706/headtohead/17/42/match/27751100")
    time.sleep(5)
    elements = driver.find_elements_by_xpath("//div[contains(@class,'col-sm-5')]//div[contains(@class,'hidden-md-up')]")
    for ele in elements:
        datalist = []
        data = ele.find_elements_by_xpath(".//div[contains(@class,'cursor-pointer')]")
        for d in data:
            datalist.append(d.get_attribute("innerText"))
        print(datalist)
    

    输出:

    ['W', 'L', 'L', 'W', 'W']
    ['L', 'L', 'L', 'L', 'D']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-24
      • 2018-11-16
      • 2016-07-18
      • 1970-01-01
      • 2023-03-07
      • 2020-01-17
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多