【问题标题】:How can I locate the "Copyright" text?如何找到“版权”文本?
【发布时间】:2022-01-24 13:49:35
【问题描述】:

我是 selenium 的新手,我正在尝试从网站中查找部分文本(“版权”)。如果存在,程序将打印“成功”,否则将打印“失败”。有问题: 我不知道如何找到那部分文本。没有class,没有id,我没有CSS代码。我完全什么都不知道。

这是我写的代码,我尝试了几次

import time

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

PATH = Service("/Users/fscozano/documenti/chromedriver-2.exe")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://apod.nasa.gov/apod/random_apod.html")

try:
    # search1 = driver.find_element(By.XPATH, "/html/body/center[2]/b[2]")
    copyr = driver.find_element(By.NAME, "Copyright").text
    # search = WebDriverWait(driver, 1).until(

    print(copyr)
    print("success")

except:
    print("failed")
    time.sleep(3)

如果我一无所知并且它是较大文本的一部分,我应该如何找到“版权”? 您可以亲自查看网站并找出问题所在

【问题讨论】:

    标签: python selenium-webdriver


    【解决方案1】:

    您的代码/方法存在一些问题。

    1. 您想要的文本位于 IFRAME 中。要允许 Selenium 查看 IFRAME 内部,您需要将上下文切换到该 IFRAME。最佳做法是等待 IFRAME 可用,然后切换到它。见the docs

    2. 一旦您进入该 IFRAME,您就可以搜索所需的元素。一个问题是你没有明确定义你想要什么作为输出。您的代码正在尝试从“版权”元素(不存在)中检索 .text。每次页面重新加载时,都会显示不同的图像并...

      1. 它可能受版权保护,也可能不受版权保护
      2. 版权可能是也可能不是超链接
      3. 版权可能包含一个或多个链接

      为了让一切更简单,我将提供代码来获取包含“版权”文本的 CENTER 标记中的所有文本,例如,

      Our Rotating Earth
      Video Credit & Copyright: Bartosz Wojczyński
      
    3. 您应该使用.find_elements 而不是try-catch,因为它不涉及抛出和捕获异常。异常应该是异常的(罕见的),而不是(通常)用作流控制。

    这是更新后的代码。

    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    driver.get("https://apod.nasa.gov/apod/random_apod.html")
    
    wait = WebDriverWait(driver, 10)
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'apod')))
    copyr = driver.find_elements(By.XPATH, "//center[.//b[contains(.,'Copyright')]]")
    if copyr:
        print(copyr)
        print("success")
    else:
        print("failed")
    

    我尝试了很多次,它成功了,但可能有一些例子也打破了这一点。

    【讨论】:

      【解决方案2】:
      1. 您使用了错误的定位器
      2. 您应该在访问之前添加一个等待以使该元素完全加载
      3. 您尝试访问的元素不在视图中,您需要向下滚动页面
        这应该有效:
      import time
      
      from selenium import webdriver
      from selenium.webdriver.chrome.service import Service
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.support.ui import WebDriverWait
      from webdriver_manager.chrome import ChromeDriverManager
      from selenium.webdriver.common.action_chains import ActionChains
      
      PATH = Service("/Users/fscozano/documenti/chromedriver-2.exe")
      
      driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
      wait = WebDriverWait(driver, 20)
      actions = ActionChains(driver)
      
      driver.get("https://apod.nasa.gov/apod/random_apod.html")
      credit = wait.until(EC.presence_of_element_located((By.XPATH, "//b[contains(text(),'Credit')]/following-sibling::a")))
      actions.move_to_element(credit).perform()
      time.sleep(0.5)
      credits = driver.find_elements(By.XPATH, "//b[contains(text(),'Credit')]/following-sibling::a")
      for credit in credits:
          print(credit.text)
      

      【讨论】:

      • 它不起作用。错误在 copyright = wait.until(EC.presence_of_element_located((By.XPATH, "//center[./b[contains(text(),'Copyright')]]//a")))
      • 您看到了什么错误?超时、无效语法等?
      • TiemoutException
      • 很高兴,但你必须清楚地定义任务。
      • 好的,当然。但目前我想不出为什么这对你不起作用
      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 2023-02-05
      • 2016-03-13
      • 2014-05-28
      • 2020-11-21
      • 2011-04-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多