提问人:amspsingh04 提问时间:8/12/2023 最后编辑:undetected Seleniumamspsingh04 更新时间:8/13/2023 访问量:118
如何使用 selenium 从 webelement 中提取文本
How can I extract the text from a webelement using selenium
问:
在这里,我尝试访问 leetcode 问题标题,这些标题可在给定的链接中找到。但是,我似乎无法访问指定 Web 元素中的文本。我得到的错误说:
AttributeError: 'list' object has no attribute 'text'
我还收到一个警告:
service = Service(executable_path=gecko, log_path='geckodriver.log')
DeprecationWarning: log_path has been deprecated, please use log_output
请帮我解决这些问题,因为我找不到任何不返回相同错误的解决方案。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
# URL of the page with questions
url = 'https://leetcode.com/problemset/all/?page=1&topicSlugs=array'
gecko= 'path'
i = 3
# XPath expression for the elements containing the text
xpath_expression = f"/html/body/div[1]/div/div[2]/div[1]/div[1]/div[5]/div[2]/div/div/div[2]/div[1]/div[2]/div/div/div/div/a"
firefox_path="path"
options = Options()
service = Service(executable_path=gecko, log_path='geckodriver.log')
driver = webdriver.Firefox()
driver.get(url)
element = driver.find_elements(By.XPATH, xpath_expression)
element_text = element.get_attribute('text')
print(element_text)
driver.quit()
答:
1赞
vizallati
8/12/2023
#1
返回的 Web 元素是一个列表,因此这应该适用于您的情况
element_text = element[0].text
但理想情况下,列表意味着多个元素,因此迭代是有意义的
elements = driver.find_elements(By.XPATH, xpath_expression)
for element in elements:
element_text = element.text
print("Element text:", element_text)
2赞
Yaroslavm
8/12/2023
#2
您正在使用返回集合的方法,而不是返回单个元素的方法。
集合没有属性。find_elements
find_element
text
要从单个元素返回文本,您应该使用
driver.find_element(By.XPATH, xpath_expression).text
如果要打印集合中元素的所有文本,可以使用循环:
for element in paragraph_elements:
print(element.text)
此外,我建议使用更具体的xPath表达式来定位您的元素/元素。
类似 CSS 选择器的东西[role=row] .truncate a
评论
0赞
amspsingh04
8/12/2023
您好,我认为我确实需要一个更具体的 xPath 表达式来定位元素,但我不确定该怎么做,你能帮忙吗这里出现的问题是,当我尝试使用元素时,它返回一个空列表,我认为这意味着它并没有真正到达我希望它到达的元素,我实际上得到了这个 selenium.common.exceptions.NoSuchElementException: 消息:无法找到元素:/html/body/div[1]/div/div[2]/div[1]/div[1]/div[5]/div[2]/div[2]/div[1]/div[2]/div/div/a
0赞
Yaroslavm
8/12/2023
你能做一个屏幕/节目,你想得到什么元素或元素吗?
0赞
amspsingh04
8/12/2023
imgur.com/a/snTXDnS我想摘录“1.两个总和“,正如您在左侧看到的,我已经复制了它的 XPath 和 URL 并将其放入此代码中它仍然没有运行,我不知道如何运行
0赞
Yaroslavm
8/12/2023
@amspsingh04这个元素可以通过以下方式找到driver.find_element(By.CSS_SELECTOR, '.truncate [href*=two-sum]')
1赞
amspsingh04
8/13/2023
非常感谢你,完成了这个和 Undetected-Selenium 的答案
0赞
undetected Selenium
8/13/2023
#3
你快到了。您正在寻找文本为 63 的(单个)元素。独特路径 II.所以你需要使用 find_element() 而不是 find_elements
()。
溶液
但是,要提取可见文本 63.唯一路径 II:理想情况下,您需要为 visibility_of_element_located() 诱导 WebDriverWait,并且使用索引可以使用以下任一定位器策略:[0]
使用CSS_SELECTOR和文本属性:
driver.get(url='https://leetcode.com/problemset/all/?page=1&topicSlugs=array') elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[href='/problems/unique-paths-ii/'][class^='h-5']"))) print(elements[0].text)
使用 XPATH 和 :
get_attribute("innerHTML")
driver.get(url='https://leetcode.com/problemset/all/?page=1&topicSlugs=array') elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[starts-with(@class, 'h-5') and @href='/problems/unique-paths-ii/']"))) print(elements[0].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
您可以在如何使用 Selenium 检索 WebElement 的文本 - Python 中找到相关讨论
引用
链接到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性返回The text of the element.
- 使用 Selenium 的文本和 innerHTML 之间的区别
评论