在 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 匹配 WebElements 的 list 并打印这些内容时,输出是:
[
<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_selector
和 get_attribute()
:
print(driver.find_element_by_css_selector("yt-formatted-string.style-scope.ytd-video-renderer").get_attribute("innerHTML"))
使用 xpath
和 text 属性:
print(driver.find_element_by_xpath("//yt-formatted-string[@class='style-scope ytd-video-renderer']").text)
理想情况下,要打印文本 3,862.76,您必须为 visibility_of_element_located()
引入 ,您可以使用以下任一方法以下 :
使用 CSS_SELECTOR
和 get_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"))
使用 XPATH
和 text 属性:
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
我正在制作一个 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 匹配 WebElements 的 list 并打印这些内容时,输出是:
[
<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_selector
和get_attribute()
:print(driver.find_element_by_css_selector("yt-formatted-string.style-scope.ytd-video-renderer").get_attribute("innerHTML"))
使用
xpath
和 text 属性:print(driver.find_element_by_xpath("//yt-formatted-string[@class='style-scope ytd-video-renderer']").text)
理想情况下,要打印文本 3,862.76,您必须为 visibility_of_element_located()
引入
使用
CSS_SELECTOR
和get_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"))
使用
XPATH
和 text 属性: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