【问题标题】:Getting text value of a HTML tag through Selenium Web Automation in Python?通过 Python 中的 Selenium Web Automation 获取 HTML 标签的文本值?
【发布时间】:2021-01-12 13:09:40
【问题描述】:

我正在制作一个reddit bot,它将在cmets 中查找某些属性,使用selenium 访问信息网站,并使用driver.find_element_by... 获取该标签内的值,但它不起作用。

当我使用driver.find_element_by_class_name()时,这是返回的数据:

<selenium.webdriver.remote.webelement.WebElement (session="f454dcf92728b9db4de080a27a844bf7", element="514bd57d-99d7-4fce-a05d-3fa92f66ad49")>

当我使用driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer") 时,返回:

[
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", element="6b4ee3e2-5e6b-48e2-8ec8-9083bf15baea")>, 
  <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", ...
]

当我使用driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer")时。

假设这是我试图定位的(上面的代码返回了这个标签的上面的 Selenium 数据):

<yt-formatted-string class="style-scope ytd-video-renderer" aria-label="Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 by Melodic Star 2 months ago 4 minutes, 18 seconds 837,676 views">Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』</yt-formatted-string>

我想要什么

我希望Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 被退回。

我能做什么?

【问题讨论】:

    标签: python selenium selenium-webdriver webdriverwait praw


    【解决方案1】:

    使用.text

    element = driver.find_element_by_xpath('//*[@id="container"]/h1/yt-formatted-string')
    print(element.text)
    

    【讨论】:

      【解决方案2】:

      看来你已经够近了。当您使用 driver.find_element_by_class_name() 时,将返回第一个匹配的 WebElement。在打印时,输出是:

      <selenium.webdriver.remote.webelement.WebElement (session="f454dcf92728b9db4de080a27a844bf7", element="514bd57d-99d7-4fce-a05d-3fa92f66ad49")>
      

      代表 WebElement 本身,可能包含所需的文本。

      在类似的行上driver.find_elements_by_css_selector(".style-scope.ytd-video-renderer") 返回一个匹配 WebElementslist 并且在打印这些行时,输出是:

      [
        <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2", element="6b4ee3e2-5e6b-48e2-8ec8-9083bf15baea")>, 
        <selenium.webdriver.remote.webelement.WebElement (session="43cb953cde81df270260bf769fe081a2",
        ...
      ]
      

      解决方案

      从以下 HTML 中提取文本 Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』

      <yt-formatted-string class="style-scope ytd-video-renderer" aria-label="Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』 by Melodic Star 2 months ago 4 minutes, 18 seconds 837,676 views">Sword Art Online: Alicization Lycoris Opening Full『ReoNa - Scar/let』</yt-formatted-string>
      

      您可以使用以下任一Locator Strategies

      • 使用css_selectorget_attribute()

        print(driver.find_element_by_css_selector("yt-formatted-string.style-scope.ytd-video-renderer").get_attribute("innerHTML"))
        
      • 使用xpathtext属性:

        print(driver.find_element_by_xpath("//yt-formatted-string[@class='style-scope ytd-video-renderer']").text)
        

      理想情况下,要打印文本3,862.76,您必须为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:

      • 使用CSS_SELECTORget_attribute()

        print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "yt-formatted-string.style-scope.ytd-video-renderer"))).get_attribute("innerHTML"))
        
      • 使用XPATHtext属性:

        print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//yt-formatted-string[@class='style-scope ytd-video-renderer']"))).text)
        
      • 注意:您必须添加以下导入:

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


      结尾

      链接到有用的文档:

      【讨论】:

      • 谢谢,只是希望您再多谈一谈-假设我有多个&lt;span class="tags"&gt; Lorem Ipsum &lt;/&gt;,并且我使用driver.find_elements_by... 而不是driver.find_element_by...,它会返回文本为一个长字符串还是每个属性都有一个新行(我正在存储这些数据并让它通过 PRAW 回复 Reddit 评论,所以如果我使用comment.reply("tags: {}".format(tags)),它是否会将所有标签放在一个字符串中没有空格还是会在每个标签之间留一个空格?
      • @KazutoKiritoKirigaya driver.find_elements 将始终返回一个列表。您必须迭代列表以提取文本。
      • 就是这样,它说driver.find_elements_by...是不可迭代的。
      • @KazutoKiritoKirigaya 没错,但我们也可以为您提供最佳解决方案 :) 根据您的新要求随时提出新问题。 StackOverflow 贡献者将很乐意为您提供帮助。
      • 这个问题是否没有明显的替代解决方案,以便我可以从driver.find_elements_by... 中提取文本?
      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 2021-12-01
      • 2022-11-10
      • 2021-02-21
      • 1970-01-01
      • 2019-07-18
      • 2020-01-15
      • 2020-12-07
      相关资源
      最近更新 更多