在 Python 中通过 Selenium Web Automation 获取 HTML 标签的文本值?

Getting text value of a HTML tag through Selenium Web Automation in Python?

我正在制作一个 reddit 机器人,它将在评论中查找某些属性,使用 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』退货。

我能做什么?

使用.text:

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

看来你已经很接近了。当您使用 driver.find_element_by_class_name() 时,将返回第一个匹配的 。打印相同时,输出为:

<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") returns 匹配 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>

您可以使用以下任一项 :

  • 使用 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() 引入 ,您可以使用以下任一方法以下 :

  • 使用 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
    

You can find a relevant discussion in


结尾

Link 到有用的文档:

  • get_attribute()方法Gets the given attribute or property of the element.
  • text属性returnsThe text of the element.
  • Difference between text and innerHTML using Selenium