【问题标题】:How can I grab a h1 tag with Selenium in Python如何在 Python 中使用 Selenium 获取 h1 标签
【发布时间】:2021-07-03 10:15:49
【问题描述】:

我想从yahoo finance 自动获取给定股票名称的 h1 标签(Netflix 将作为示例)。这是我到目前为止得到的:

from selenium import webdriver
import time
 
driver = webdriver.Firefox() # Select the browser
driver.get('https://finance.yahoo.com/') # Open the website

time.sleep(2)

try:
    driver.find_element_by_name("agree").click() #Check for cookie alert
except:
    print("No cookies today!")

searchbar = driver.find_element_by_id("yfin-usr-qry") #Find searchbar
searchbar.send_keys("NFLX") #Send the stock name
time.sleep(2)
searchbutton = driver.find_element_by_id("search-buttons") #Enter the search
searchbutton.click()

#This is where I need help

title = driver.find_element_by_tag_name("h1")

print(str(title))

一切正常,直到我尝试通过 .find_element_by_tag_name("h1") 获取标题:Netflix, Inc. (NFLX)。 html源代码如下所示:

<div class="D(ib) " data-reactid="6">
    <h1 class="D(ib) Fz(18px)" data-reactid="7">Netflix, Inc. (NFLX)</h1>
</div>

如果我要获取的元素有一个 id,那么通过 Selenium 访问它就没有问题。仅当我处理“奇怪”的类名或缺少 id 时才会出现问题。其他几个网站也有这个问题。提前致谢!

【问题讨论】:

    标签: python html selenium web-crawler finance


    【解决方案1】:

    首先,您尝试执行str(title),但它只是尝试将元素打印为 str 而不是打印元素的文本。

    我会尝试使用 XPATH 而不是标签名称来获取它。

    如:

    from selenium.webdriver.support import expected_conditions as EC
    
    title = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//h1/text()[contains(.,"NFLX")]/parent::*'))).text
    
    print(title)
    

    【讨论】:

    • 公平点与 str(title) - 谢谢!我已经尝试过 xpaths(相对和绝对),但它没有用。像您的解决方案一样,他们抛出以下异常:selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //h1/text()[contains(.,"NFLX")]/parent::*
    • 您是否尝试过使用 WebDriverWait 代替?我刚刚编辑了我的答案,检查一下不要忘记添加以下行from selenium.webdriver.support import expected_conditions as EC
    • location命令执行到早,所以我加了一个time.sleep(5)。第一个解决方案现在工作正常,你的第二个也是。我在另一个答案中总结了解决方案
    • 很高兴看到它有效。使用 WebDriverWait 比使用 time.sleep() 更推荐,如果元素加载早于睡眠中的指定秒数,则更有效。
    【解决方案2】:

    位置命令在元素加载之前执行。感谢 rekeson21,我找到了两种解决方案来解决这个问题:

    time.sleep(6)
    title = driver.find_element_by_xpath('//h1').text
    print(title)
    
    from selenium.webdriver.support import expected_conditions as EC
    
    title = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//h1/text()[contains(.,"NFLX")]/parent::*'))).text
    
    print(title)
    

    两种情况下的输出都是:

    Netflix, Inc. (NFLX)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多