定位多个元素、后代元素定位

时间:2025-10-08 10:48:40  阅读量:  分类:标签:

学习网址:/cssselecotr.html

image.png

右键,开发者工具栏、检查,选择元素 CTRL+F,查找确定你的元素。

from playwright.sync_api import sync_playwright

# 启动 playwright driver 进程
p = sync_playwright().start()

# 启动浏览器,返回 Browser 类型对象
browser = p.chromium.launch(headless=False)

# 创建新页面,返回 Page 类型对象
page = browser.new_page()
page.goto(r"E:\playwright\stock.html")
print(page.title())  # 打印网页标题栏

# 输入通讯,点击查询。这是定位与操作,是自动化重点,后文详细讲解
page.locator('#kw').fill('通讯')  # 输入通讯
page.locator('#go').click()  # 点击查询

page.wait_for_timeout(2000)

# 打印所有搜索内容
lcs = page.locator(".result-item").all()
for lc in lcs:
    print(lc.inner_text())

input('3...')
# 关闭浏览器
browser.close()
# 关闭 playwright driver 进程
p.stop()

匹配多个元素

学习网址:/cssselecotr.html

前面已经说,如果一个 locator 表达式匹配多个元素,要获取所有的元素对应的 locator 对象,使用 all 方法

locators = page.locator('.plant').all()

有时,我们只需要得到某种表达式对应的元素数量all里面一共有多少个元素,可以使用 count 方法,如下

count = page.locator('.plant').count()

返回结果就是匹配的元素数量。可以根据返回结果是否为 0 判断元素是否存在

有时,我们只需要得到某种表达式对应的第一个元素,或者最后一个元素。可以使用 first 和 last 属性,如下

lct = page.locator('.plant')
print(lct.first.inner_text(), lct.last.inner_text()) #获取第一个和最后一个元素的文本

也可以,通过 nth 方法,获取指定次序的元素,参数 0 表达第一个,1 表示第 2 个,比如

lct = page.locator('.plant')
print(lct.nth(1).inner_text())

限定范围找元素】我们只想在某一个div内,区域内,找到元素,并且打印出来,而不是整个网页进行选择。

学习网址:/cssselecotr.html

在bottom区域内找span元素,并且把所有的文字打印出来
from playwright.sync_api import sync_playwright

# 启动 playwright driver 进程
p = sync_playwright().start()

# 启动浏览器,返回 Browser 类型对象
browser = p.chromium.launch(headless=False)

# 创建新页面,返回 Page 类型对象
page = browser.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample1.html")

lct = page.locator('#bottom')

print(lct.locator('span').all_inner_texts())   #在bottom区域内找span元素,并且把所有的文字打印出来

input('....')
# 关闭浏览器
browser.close()
# 关闭 playwright driver 进程
p.stop()

子元素和后代元素选择

文字:HTML 中,元素内部可以包含其他元素,比如下面的 HTML 片段

<div id='container'>

    <div id='layer1'>  #子元素
        <div id='inner11'>  #后代元素
            <span>内层11</span>
        </div>
        <div id='inner12'>
            <span>内层12</span>
        </div>
    </div>

    <div id='layer2'>
        <div id='inner21'>
            <span>内层21</span>
        </div>
    </div>

</div>

下面的一段话有些绕口,请大家细心阅读:

id 为 container 的 div 元素包含了 id 为 layer1 layer2 的两个 div 元素。

直接子元素

这种包含是直接包含,中间没有其他的层次的元素了。所以 id 为 layer1 和 layer2 的两个 div 元素是 id 为 container 的 div 元素的直接子元素

而 id 为 layer1 的 div 元素 又包含了 id 为 inner11 和 inner12 的两个 div 元素。中间没有其他层次的元素,所以这种包含关系也是直接子元素 关系

而对于 id 为 container 的 div 元素来说,id 为 inner11、inner12、inner22 的元素 和 两个 span 类型的元素 都不是 它的直接子元素,因为中间隔了几层

虽然不是直接子元素,但是 它们还是在 container 的内部,可以称之为它 的后代元素

后代元素也包括了直接子元素,比如 id 为 layer1 layer2 的两个 div 元素 也可以说 是 id 为 container 的 div 元素 的 直接子元素,同时也是后代子元素【只要包含在内部,就是后代元素、后代元素包含直接子元素】


如果 元素 2 是 元素 1 的 直接子元素,CSS Selector 选择子元素的语法是这样的

元素 1 > 元素 2  #中间用一个大于号(我们可以理解为箭头号)

注意,最终选择的元素是 元素 2,并且要求这个 元素 2 元素 1 的直接子元素


也支持更多层级的选择,比如

元素 1 > 元素 2 > 元素 3 > 元素 4

示例图:直接子元素

image.png

示例图:后代元素 中间加上空格、多几个空格没关系,但是一定要有空格。就可以。

image.png

#layer1 div  /或者div换成span都可以

也支持更多层级的选择,比如

元素 1 > 元素 2 > 元素 3 > 元素 4


后代元素代码案例:寻找bottom 元素下的人的span元素

from playwright.sync_api import sync_playwright

# 启动 playwright driver 进程
p = sync_playwright().start()

# 启动浏览器,返回 Browser 类型对象
browser = p.chromium.launch(headless=False)

# 创建新页面,返回 Page 类型对象
page = browser.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample1.html")

lct = page.locator('#bottom')
print(lct.locator('span').all_inner_texts())

input('....')
# 关闭浏览器
browser.close()
# 关闭 playwright driver 进程
p.stop()

后代元素代码案例:寻找bottom 元素下的人的span元素【简写】

from playwright.sync_api import sync_playwright

# 启动 playwright driver 进程
p = sync_playwright().start()

# 启动浏览器,返回 Browser 类型对象
browser = p.chromium.launch(headless=False)

# 创建新页面,返回 Page 类型对象
page = browser.new_page()
page.goto("https://cdn2.byhy.net/files/selenium/sample1.html")

lct = page.locator('#bottom spaI')   #用后代选择器简写

print(lct.all_inner_texts())

input('....')
# 关闭浏览器
browser.close()
# 关闭 playwright driver 进程
p.stop()