如何用纯Playwright代码改写获取a标签href的代码并解决迭代错误
修复Playwright获取多个元素href属性的错误
你的代码报错是因为Playwright的Locator对象不是可迭代对象,不能直接用for循环遍历。page.locator()返回的是一个懒加载的查询定位器,需要调用all()方法将其转换为可迭代的元素句柄列表。
修复后的基础版代码
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(channel='chrome', headless=True) page = browser.new_page() url = "https://learningenglish.voanews.com/z/1581" page.goto(url, wait_until="networkidle") # 调用all()方法获取所有匹配的元素句柄列表 elements = page.locator('//div[@class="media-block__content"]//a').all() for e in elements: print(e.get_attribute('href'))
更高效的批量获取写法
可以直接通过浏览器上下文执行JS一次性获取所有href属性,减少元素句柄的创建开销:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(channel='chrome', headless=True) page = browser.new_page() url = "https://learningenglish.voanews.com/z/1581" page.goto(url, wait_until="networkidle") # 一次性提取所有匹配元素的href属性 hrefs = page.eval_on_selector_all( '//div[@class="media-block__content"]//a', 'elements => elements.map(el => el.href)' ) for href in hrefs: print(href)
补充说明
Locator.all():会等待所有匹配元素加载完成,返回元素句柄列表,适合需要对每个元素执行额外操作的场景。eval_on_selector_all:直接在浏览器端执行JS逻辑批量提取属性,性能更优,适合仅需批量获取属性的场景。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

