使用 Selenium 提取嵌套元素

Posted

技术标签:

【中文标题】使用 Selenium 提取嵌套元素【英文标题】:Extracting nested elements using Selenium 【发布时间】:2022-01-01 09:23:52 【问题描述】:

我有一个使用 BeautifulSoup 编写的代码,我目前正在探索 Selenium,但无法(我希望有可能)提取嵌套在某些 html 中的数据。

这是bs4代码:

def get_data(link):
    soup1 = getdata(link)
    for one_offer in soup1.find_all('li', 'class': 'clearfix'):
    # Get sqm:
        raw_sqm = one_offer.find('div', 'class': 'inline-group')
        get_sqm = raw_sqm.get_text().split(',')[1].split()[0]
        sqm_check_value = if_area_not_speicified(get_sqm)
        sqm_area.append(float(sqm_check_value))

以上代码取链接:https://www.imoti.net/bg/obiavi/r/prodava/sofia/?sid=hSrJhL 从链接我执行以下操作:

one_offer 是一个块。从上图中可以看到红色、绿色和蓝色矩形部分。之后,我从每个块中得到用红色箭头指示的区域,并将它们附加到一个列表中。

如何将其转换为 Selenium 代码?

到目前为止我有:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

PATH = '/Applications/chromedriver'
driver = webdriver.Chrome(PATH)

driver.get('https://www.imoti.net/bg/obiavi/r/prodava/sofia/?sid=hSrJhL')

variable = []

def testing_values():
    variable.append(driver.find_elements_by_class_name('clearfix'))

testing_values()
print(variable)

testing_values 函数返回以下列表:

[[<selenium.webdriver.remote.webelement.WebElement (session="45a761354e96082ad7cee4c299682bd2", element="5e3d2712-f453-4871-a43e-8d72d40e6a65")>, <selenium.webdriver.remote.webelement.WebElement (session="45a761354e96082ad7cee4c299682bd2", element="53a21fd3-495a-41d4-9382-ae61961209ed")>, <selenium.webdriver.remote.webelement.WebElement (session="45a761354e96082ad7cee4c299682bd2", element="56d80ac6-bfaa-48de-9e87-1d2f3c9a42a4")>, <selenium.webdriver.remote.webelement.WebElement (session="45a761354e96082ad7cee4c299682bd2", element="74362762-087e-4221-a4b7-cbdf10a16400")>, <selenium.webdriver.remote.webelement.WebElement (session="45a761354e96082ad7cee4c299682bd2"]

*此列表包含 30 项,但我删除了其中一些以使示例更小。

所以,我有一个包含某种网络元素的列表,但是如何从每个元素中提取数据以获取该区域,类似于使用 bs4 的代码?

【问题讨论】:

循环它和 xpath ./ 它似乎在标题 /div/h3/span 中,您可以在其中 .text 整个跨度。 您还有一个额外的 html 元素,其 class clearfix 是一个 div。 【参考方案1】:

您有一个带有 clearfix 类的额外 div 类。因此,您只想遍历它们和 xpath .// 并获取它们的文本值。

variable = []

def testing_values():
    variable.append([x.find_element_by_xpath(".//div[@class='real-estate-text']/header/div/h3/span[2]").text for x in driver.find_elements_by_xpath("//li[@class='clearfix']")])

testing_values()
print(variable)

输出:

[['543 М2', '10 М2', '12 М2', '36 М2', '660 М2', '635 М2', '44 М2', '41 М2', '50 М2', '60 М2', '50 М2', '64 М2', '64 М2', '59 М2', '90 М2', '51 М2', '1053 М2', '72 М2', '66 М2', '78 М2', '65 М2', '52 М2', '75 М2', '68 М2', '62 М2', '72 М2', '90 М2', '78 М2', '74 М2', '57 М2']]

【讨论】:

谢谢。我需要看一些关于 xpath 的教程。

以上是关于使用 Selenium 提取嵌套元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 Selenium 提取元素的 CSS 选择器

软件测试开发学习之旅----Selenium

java+selenium+new——判断某个元素是否显示 driver.findElementById("kw").isDisplayed()——判断某个元素是否可用 Sys

如何使用 Selenium 和 Java 提取表格元素的 id 属性的动态值

selenium.common.exceptions.NoSuchElementException 使用 Selenium Python 从#shadow-root (open) 中提取元素文本时出错

selenium——表单嵌套