使用BeautifulSoup的find_all匹配data-testid属性无结果的问题排查
代码有效性确认
你的代码cards = soup.find_all('div', attrs={'data-testid': 'property-card'})语法完全正确,是BeautifulSoup通过属性匹配标签的标准写法,逻辑层面没有问题。
可能的问题原因及解决方法
动态渲染导致内容未加载
Booking.com搜索结果依赖JavaScript动态渲染,若你用requests这类仅获取静态HTML的工具,初始页面里还没有data-testid="property-card"的div,自然返回空结果。而CSS选择器能生效,大概率是你使用了支持JS渲染的工具(如Selenium、Playwright)获取页面,或是巧合匹配了静态页面里的其他元素。
解决:改用Selenium、Playwright等模拟浏览器执行JS的工具,获取完整渲染后的页面源码再传入BeautifulSoup解析。属性名/值的拼写或格式差异
检查浏览器开发者工具中实际元素的data-testid属性:是否存在大小写偏差(比如data-testId)、值是否为property-card(有没有额外后缀/前缀)。直接复制工具里的属性值,确保和代码里的完全一致。解析器兼容性问题
不同HTML解析器(html.parser、lxml、html5lib)的解析结果可能有差异。如果初始用的是html.parser,可以换成lxml或html5lib尝试:soup = BeautifulSoup(page_source, 'lxml')iframe嵌套限制
确认目标div是否在iframe内部。如果是,需要先切换到对应iframe才能获取其中内容;若不在iframe,此因素可排除。
内容的提问来源于stack exchange,提问作者pomme

