如何在 Python 中使用 Selenium WebDriver 获取文本
Posted
技术标签:
【中文标题】如何在 Python 中使用 Selenium WebDriver 获取文本【英文标题】:How to get text with Selenium WebDriver in Python 【发布时间】:2014-01-26 14:20:07 【问题描述】:我正在尝试使用 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>
我该如何解决这个问题?
【问题讨论】:
如果以交互方式完成,结果可能类似于错误消息 "AttributeError: 'current-stage' object has no attribute 'getText'" 【参考方案1】:你只想要.text
。
然后您可以在获得它之后验证它,不要尝试传递您期望它应该有的东西。
【讨论】:
我收到此错误 - 'WebDriver' 对象没有属性 'getText' @user3121891,它是.text
。
@user3121891 driver.find_element_by_class_name("current-stage").text
....只需 text 就可以了。 没有别的。
您将要遍历 selenium 对象列表并在 for 循环的每个项目上应用 .text
。
是的@Arran,当我检查元素时,它显示了完整的文本,但是当我尝试抓取它时,我只能检索到网站上实际显示的缩写版本(该网站这样做是因为某些文本对于预期的样式可能太长)【参考方案2】:
Python
element.text
Java
element.getText()
C#
element.Text
红宝石
element.text
【讨论】:
我找不到任何关于 Python 的文档,你们在哪里找到的? @CharlesSmith 如果你在 VSCode 中的元素后面加上.
,你会得到一个基于类接受的建议列表。我就是这样发现的。
是的,我在 IntelliJ 中注意到了同样的情况,只是想知道为什么它不在文档中
@Charles Smith:它位于 Web element 的子部分 “获取元素文本”(在页面底部)。有六种不同的语言,默认为 javascript。点击“Python”查看Python代码示例。【参考方案3】:
答案是:
driver.find_element_by_class_name("ctsymbol").text
【讨论】:
【参考方案4】:要打印文本my text
,您可以使用以下任一Locator Strategies:
使用class_name
和get_attribute("textContent")
:
print(driver.find_element(By.CLASS_NAME, "current-stage").get_attribute("textContent"))
使用css_selector
和get_attribute("innerHTML")
:
print(driver.find_element(By.CSS_SELECTOR, "span.current-stage").get_attribute("innerHTML"))
使用xpath
和text 属性:
print(driver.find_element(By.XPATH, "//span[@class='current-stage']").text)
理想情况下,您需要为visibility_of_element_located()
诱导WebDriverWait,您可以使用以下任一Locator Strategies:
使用CLASS_NAME
和get_attribute("textContent")
:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CLASS_NAME, "current-stage"))).get_attribute("textContent"))
使用CSS_SELECTOR
和text属性:
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.current-stage"))).text)
使用XPATH
和get_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找到相关讨论
参考文献
链接到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性返回 The text of the element.
Difference between text and innerHTML using Selenium
【讨论】:
【参考方案5】:你可以使用:
element = driver.find_element_by_class_name("class_name").text
这将返回元素内的文本,并允许您在此之后对其进行验证。
【讨论】:
【参考方案6】:这是正确的答案。成功了!!
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)
【讨论】:
【参考方案7】:当无法在自定义类中获取某些内容或更改 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
【讨论】:
你能解释一下为什么它绝对是无价的吗? 为什么需要.click()
?为什么.text
会有三行?
问题说“请注意我不想使用XPath”.以上是关于如何在 Python 中使用 Selenium WebDriver 获取文本的主要内容,如果未能解决你的问题,请参考以下文章
等待页面重定向 Selenium WebDriver (Python)
Python 使用selenium技术对Excel文件进行读写
Python爬虫(二十二)_selenium案例:模拟登陆豆瓣