如何使用 Selenium 和 Python 从 html 获取文本,它有两个具有相同类名的元素,我需要在其中提取这两个元素
How to get text from a html using Selenium and Python which has two elements with the same classname where I need to extract both
我有一个 html 像:
<div class='mesage-in'> cool text here </div>
<div class='mesage-in'> bad text here </div>
我的 python 代码如下:
texto = navegador.find_element_by_class_name('message-in').text
print(texto)
是否可以让这得到所有具有相同 class 名称的元素并放入数组或像这样定义为不同的变量?
输出:
print(texto1)
-> cool text here
print(texto2)
-> bad text here
#或
print(texto[0])
-> cool text here
print(texto[1])
-> bad text here
其实我的代码只得到第一个
您可以使用 BeautifulSoup 库来实现。
示例输出:
[' cool text here ', ' bad text here ']
from bs4 import BeautifulSoup
def get_class_texts(html_text: str, class_name: str):
soup = BeautifulSoup(html_text, features="html.parser")
return [tag.text for tag in soup.select(f".{class_name}")]
print(get_class_texts("<div class='mesage-in'> cool text here </div> <div class ='mesage-in'> bad text here </div>", "mesage-in"))
要将多个元素放入一个数组中,您需要使用 find_elements。在您的情况下,我会像这样使用 xpath:
eleArray = self.driver.find_elements(By.XPATH, '//div[@class='mesage-in']');
然后,您可以像这样遍历数组:
for element in eleArray:
print(element.text)
这是一个类似的示例,我从维基百科获取所有拉丁文可编码跨度元素并将它们记录到控制台。随意运行看看结果(顺便说一下,这个产品是免费使用的,所以你可以通过google登录转移测试用例并创建自己的帐户):
https://mx1.maxtaf.com/cases/a320a3ad-9949-4bce-87fa-7a0980df8f1f?projectId=bugtestproject2
您可以将它们存储到列表中。该列表将是网络元素列表。
如我所见,您正在使用 navegador.find_element
,这将 return 一个网络元素。
而 navegador.find_elements
将 return 网络元素列表。
此外,在最新的 Selenium 中 find_element_by_class_name
已被弃用,因此我建议您使用 navegador.find_element(By.CLASS_NAME, "")
代码:
texto = navegador.find_elements(By.CLASS_NAME, 'message-in')
print(texto[0])
print(texto[1])
or
for txt in texto:
print(txt.text)
根据 HTML:
<div class='mesage-in'> cool text here </div>
<div class='mesage-in'> bad text here </div>
下面一行代码行:
texto = navegador.find_element_by_class_name('message-in').text
将始终识别第一个匹配元素,提取文本并将其分配给texto
。因此,当您尝试打印 texto
时,第一个元素的文本即 cool text here 被打印出来。
解决方案
你可以获取所有具有相同类名的元素,即 mesage-in
并按如下方式放入列表中:
from selenium.webdriver.common.by import By
texto = navegador.find_elements(By.CLASS_NAME, 'message-in')
现在您可以按如下方式打印所需文本及其索引:
要在此处打印很酷的文字:
print(texto[0].text) # prints-> cool text here
要在此处打印错误文本:
print(texto[1].text) # prints-> bad text here
结尾
您还可以使用 创建一个文本列表并打印如下:
texto = [my_elem.text for my_elem in driver.find_elements(By.CLASS_NAME, "message-in")]
print(texto[0]) # prints-> cool text here
print(texto[1]) # prints-> bad text here
我有一个 html 像:
<div class='mesage-in'> cool text here </div>
<div class='mesage-in'> bad text here </div>
我的 python 代码如下:
texto = navegador.find_element_by_class_name('message-in').text
print(texto)
是否可以让这得到所有具有相同 class 名称的元素并放入数组或像这样定义为不同的变量?
输出:
print(texto1)
-> cool text here
print(texto2)
-> bad text here
#或
print(texto[0])
-> cool text here
print(texto[1])
-> bad text here
其实我的代码只得到第一个
您可以使用 BeautifulSoup 库来实现。
示例输出:
[' cool text here ', ' bad text here ']
from bs4 import BeautifulSoup
def get_class_texts(html_text: str, class_name: str):
soup = BeautifulSoup(html_text, features="html.parser")
return [tag.text for tag in soup.select(f".{class_name}")]
print(get_class_texts("<div class='mesage-in'> cool text here </div> <div class ='mesage-in'> bad text here </div>", "mesage-in"))
要将多个元素放入一个数组中,您需要使用 find_elements。在您的情况下,我会像这样使用 xpath:
eleArray = self.driver.find_elements(By.XPATH, '//div[@class='mesage-in']');
然后,您可以像这样遍历数组:
for element in eleArray:
print(element.text)
这是一个类似的示例,我从维基百科获取所有拉丁文可编码跨度元素并将它们记录到控制台。随意运行看看结果(顺便说一下,这个产品是免费使用的,所以你可以通过google登录转移测试用例并创建自己的帐户): https://mx1.maxtaf.com/cases/a320a3ad-9949-4bce-87fa-7a0980df8f1f?projectId=bugtestproject2
您可以将它们存储到列表中。该列表将是网络元素列表。
如我所见,您正在使用 navegador.find_element
,这将 return 一个网络元素。
而 navegador.find_elements
将 return 网络元素列表。
此外,在最新的 Selenium 中 find_element_by_class_name
已被弃用,因此我建议您使用 navegador.find_element(By.CLASS_NAME, "")
代码:
texto = navegador.find_elements(By.CLASS_NAME, 'message-in')
print(texto[0])
print(texto[1])
or
for txt in texto:
print(txt.text)
根据 HTML:
<div class='mesage-in'> cool text here </div>
<div class='mesage-in'> bad text here </div>
下面一行代码行:
texto = navegador.find_element_by_class_name('message-in').text
将始终识别第一个匹配元素,提取文本并将其分配给texto
。因此,当您尝试打印 texto
时,第一个元素的文本即 cool text here 被打印出来。
解决方案
你可以获取所有具有相同类名的元素,即 mesage-in
并按如下方式放入列表中:
from selenium.webdriver.common.by import By
texto = navegador.find_elements(By.CLASS_NAME, 'message-in')
现在您可以按如下方式打印所需文本及其索引:
要在此处打印很酷的文字:
print(texto[0].text) # prints-> cool text here
要在此处打印错误文本:
print(texto[1].text) # prints-> bad text here
结尾
您还可以使用
texto = [my_elem.text for my_elem in driver.find_elements(By.CLASS_NAME, "message-in")]
print(texto[0]) # prints-> cool text here
print(texto[1]) # prints-> bad text here