如何使用 selenium 从 webelement 中提取文本

How can I extract the text from a webelement using selenium

提问人:amspsingh04 提问时间:8/12/2023 最后编辑:undetected Seleniumamspsingh04 更新时间:8/13/2023 访问量:118

问:

在这里,我尝试访问 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()
python selenium-webdriver 网页抓取 xpath css 选择器

评论


答:

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_elementsfind_elementtext

要从单个元素返回文本,您应该使用

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 中找到相关讨论


引用

链接到有用的文档: