如何使用Python的Selenium WebDriver获取文本

152

我正在尝试使用Selenium WebDriver获取文本,这是我的代码。请注意,我不想使用XPath,因为在我的情况下,每次重新启动网页时ID都会改变。

我的代码:

text = driver.find_element_by_class_name("current-stage").getText("my text")

HTML:

<span class="current-text" id="yui_3_7_0_4_1389185744113_384">my text</span>

我该怎么修复这个问题?


1
如果以交互方式完成,则结果可能是类似于错误消息“AttributeError:'current-stage'对象没有'text'属性”的东西。 - Peter Mortensen
9个回答

266

你只需要使用.text

获取内容后,你可以进行验证,不要试图传入你期望的内容。


我遇到了这个错误 - “WebDriver”对象没有“getText”属性。 - user3121891
3
@user3121891,这是 .text - Arran
18
driver.find_element_by_class_name("current-stage").text 只是返回该元素的文本内容,没有任何其他信息。 - Arran
1
你需要循环遍历Selenium对象列表,并在for循环的每个项上应用.text - pppp
1
是的,Arran。当我检查元素时,它显示完整的文本,但当我尝试抓取它时,我只能检索到缩写版,这才是实际显示在网站上的内容(该网站的设计者这样做是因为有些文本可能太长而不适合所需的样式)。 - GitHunter0
显示剩余6条评论

112

Python

element.text

Java

element.getText()

C#

element.Text

Ruby

element.text

3
我找不到有关Python的任何文档资料,你们在哪里找到这些信息? - Amon
2
@CharlesSmith 如果您在VSCode中的元素后面添加一个“.”,则会根据该类接受的内容提供建议列表。这就是我找到它的方法。 - CodeSpent
1
是的,我在IntelliJ中也注意到了同样的问题,只是想知道为什么它没有在文档中提到。 - Amon
2
@Charles Smith:它在 *Web元素*,子部分为“获取元素文本”(页面底部)。有六种不同的语言,默认为JavaScript。单击“Python”以查看Python代码示例。 - Peter Mortensen
那个链接现在已经半失效了。有关getText/text的使用示例现在在“Web元素”子页面上,具体请参见 *查找Web元素*,子部分“获取元素”。还要注意,单击选项卡(例如,“Python”)会更改所有页面上的所有视图,而不仅仅是单击的页面。这是一个使用getText/text的示例。我不知道getText/text的正式文档在哪里。它一定在该网站的某个地方。 - Peter Mortensen
显示剩余2条评论

22

要打印文本my text,您可以使用以下任一定位策略

  • 使用class_nameget_attribute("textContent")

print(driver.find_element(By.CLASS_NAME, "current-stage").get_attribute("textContent"))
  • 使用 css_selectorget_attribute("innerHTML")

  • print(driver.find_element(By.CSS_SELECTOR, "span.current-stage").get_attribute("innerHTML"))
    
  • 使用xpathtext属性:

    print(driver.find_element(By.XPATH, "//span[@class='current-stage']").text)
    

  • 理想情况下,您需要使用WebDriverWait等待 visibility_of_element_located() ,您可以使用以下任一定位策略

    • 使用CLASS_NAMEget_attribute("textContent")

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CLASS_NAME, "current-stage"))).get_attribute("textContent"))
    
  • 使用 CSS_SELECTORtext 属性:

  • print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.current-stage"))).text)
    
  • 使用XPATHget_attribute("innerHTML")

  • print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='current-stage']"))).get_attribute("innerHTML"))
    
  • 注意:您需要添加以下导入:

  • from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

    您可以在How to retrieve the text of a WebElement using Selenium - Python 中找到相关讨论。


    参考文献

    有用文档的链接:


    11
    答案是:
    driver.find_element_by_class_name("ctsymbol").text
    

    7

    您可以使用:

    element = driver.find_element_by_class_name("class_name").text
    

    这将返回元素中的文本,并允许您在此之后验证它。

    3

    这是正确答案。它有效了!

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    
    driver = webdriver.Chrome("E:\\Python\\selenium\\webdriver\\chromedriver.exe")
    driver.get("https://www.tatacliq.com/global-desi-navy-embroidered-kurta/p-mp000000000876745")
    driver.set_page_load_timeout(45)
    driver.maximize_window()
    driver.implicitly_wait(2)
    driver.get_screenshot_as_file("E:\\Python\\Tatacliq.png")
    print ("Executed Successfully")
    driver.find_element_by_xpath("//div[@class='pdp-promo-title pdp-title']").click()
    SpecialPrice = driver.find_element_by_xpath("//div[@class='pdp-promo-title pdp-title']").text
    print(SpecialPrice)
    

    1
    注意:如果在Selenium 4更新后找到这个线程的任何人,请注意。 driver.find_element_by_*已被弃用,使用它将会给出一个 "deprecationwarning"警告。替代方法是:driver.find_element(By.X,“name”)。请查看Selenium 4信息。

    是的。例如,从a comment:"find_element_by_*find_elements_by_*在Selenium 4.3.0中已被删除。请改用find_element。"虽然它并没有真正回答问题,如果元素的数量与恰好为一个不同怎么办(例如,如果元素不存在则抛出异常。唯一的解决方案可能是捕获异常(无法防止它))。 - Peter Mortensen

    0

    当无法在自定义类中获取某些内容或更改ID时,我发现这非常有价值:

    driver.find_element_by_xpath("//*[contains(text(), 'Show Next Date Available')]").click()
    driver.find_element_by_xpath("//*[contains(text(), 'Show Next Date Available')]").text
    driver.find_element_by_xpath("//*[contains(text(), 'Available')]").text
    driver.find_element_by_xpath("//*[contains(text(), 'Avail')]").text
    

    1
    你能解释一下为什么它是绝对无价的吗? - Peter Mortensen
    为什么需要.click()?为什么有三行带有.text - Peter Mortensen
    问题中提到:“请注意,我不想使用XPath”。 - Peter Mortensen

    0

    从元素中获取文本:

    url=driv.find_element(By.whatDoYouWant, "ClassNameOrwhatDoYouWant").text
    print(url)
    

    例子:

    url = web.find_element(By.TAG_NAME, "a").text
    print(url)
    

    从元素中获取文本:

    示例:

    for i in range(6):
        var = web.find_elements(By.TAG_NAME, "input")[i].text
        print(var)
    

    1
    我建议您使用编辑器中可用的格式选项并正确标记源代码,以使您的答案更易于阅读和理解。 - xjmdoo

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接