Python 获取元素 CSS 选择器 - 优化代码,生成类似 body > div:nth-child(1) > div > ... 的选择器

本文介绍一种 Python 代码,通过遍历元素的父元素,并结合元素的标签名称、索引等信息,生成类似于 body > div:nth-child(1) > div > ... 这种结构的 CSS 选择器。代码经过优化,处理了元素在父元素中可能不是唯一的情况,更加准确地获取选择器。

修改后的代码:

def get_css_selector(element):
    # 获取元素的标签名称
    tag_name = element.tag_name

    # 生成 CSS 选择器
    css_selector = f"{tag_name}"

    parent = element.find_element(By.XPATH, "..")

    while parent is not None:
        # 获取父元素的标签名称
        parent_tag_name = parent.tag_name

        # 获取父元素的子元素列表
        siblings = parent.find_elements(By.XPATH, f"./{tag_name}")

        # 如果父元素的子元素列表中只有一个与当前元素相同的元素,则不再向上查找
        if len(siblings) == 1:
            break

        # 获取当前元素在父元素的子元素列表中的索引
        index = siblings.index(element) + 1

        # 拼接父元素的 CSS 选择器
        css_selector = f"{parent_tag_name} > :nth-child({index}) > {css_selector}"

        # 继续向上查找父元素
        element = parent
        parent = element.find_element(By.XPATH, "..")

    return css_selector

代码解释:

  1. 代码首先获取目标元素的标签名称,并以此作为 CSS 选择器的初始部分。
  2. 然后使用 find_element(By.XPATH, "..") 获取目标元素的父元素,并进入循环遍历父元素。
  3. 在循环中,获取父元素的标签名称,以及该父元素的所有子元素列表。
  4. 如果该父元素的子元素列表中只包含一个与目标元素相同的元素,则说明该元素在父元素中是唯一的,可以直接拼接父元素标签名称和当前的 CSS 选择器,并跳出循环。
  5. 否则,获取目标元素在父元素子元素列表中的索引(从 1 开始),并使用 :nth-child() 选择器将索引信息加入到 CSS 选择器中。
  6. 最后,将当前元素设置为父元素,并继续向上遍历父元素,直到找到唯一的元素或者到达网页的根节点。

示例:

假设要获取以下网页结构中的 img 元素的 CSS 选择器:

<body>
    <div>
        <div>
            <div class="mod-weixin-area">
                <div class="mod-frame__content_wrapper">
                    <div>
                        <div class="mod-weixin-area__body mod-weixin-area__body_padding">
                            <div>
                                <div>
                                    <div>
                                        <div>
                                            <div>
                                                <div>
                                                    <div class="wg-component-main">
                                                        <div>
                                                            <div>
                                                                <div class="wg-component-entity_main">
                                                                    <span>
                                                                        <img src="...">
                                                                    </span>
                                                                </div>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>

使用 get_css_selector() 函数获取 img 元素的 CSS 选择器,会得到以下结果:

body > div:nth-child(1) > div > div.mod-weixin-area > div.mod-frame__content_wrapper > div > div.mod-weixin-area__body.mod-weixin-area__body_padding > div > div > div > div > div:nth-child(4) > div > div > div:nth-child(4) > div > div.wg-component-main > div > div > div.wg-component-entity_main > span > img

注意:

  • 该代码假设元素的父元素可以通过 find_element(By.XPATH, "..") 找到。
  • 代码没有考虑元素的属性,只考虑了元素的标签名称和索引。如果需要根据属性生成选择器,需要修改代码逻辑。
  • 代码没有处理元素可能没有父元素的情况,需要根据实际情况进行判断。
  • 代码没有处理元素在父元素中存在重复的情况,如果存在重复,可能无法生成唯一的 CSS 选择器。

结论:

通过遍历元素的父元素,并结合元素的标签名称、索引等信息,可以生成类似于 body > div:nth-child(1) > div > ... 这种结构的 CSS 选择器。代码经过优化,处理了元素在父元素中可能不是唯一的情况,更加准确地获取选择器。

扩展:

可以使用 BeautifulSoup 等库解析 HTML 文档,获取元素的属性信息,进一步完善 CSS 选择器的生成逻辑。

希望本文能帮助您更好地理解如何使用 Python 代码获取元素的 CSS 选择器。

Python 获取元素 CSS 选择器 - 优化代码,生成类似 body > div:nth-child(1) > div > ... 的选择器

原文地址: https://www.cveoy.top/t/topic/o98M 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录