使用BeautifulSoup爬取时如何匹配_ngcontent-c0属性元素
问题根源
_ngcontent-c0不是类名,也不是标签名的组成部分,是Angular框架编译时自动给元素注入的动态属性,这类带c+数字后缀的属性值会随前端版本迭代随机变化,完全不适合作为元素定位依据。
另外你用requests直接请求拿到的只是服务器返回的初始静态HTML,Angular渲染的页面内容需要浏览器执行客户端JS后才会挂载到DOM上,初始源码里根本不存在你要找的故事条目,这也是你匹配不到目标内容的核心原因。
你写的选择器本身也存在语法错误:span__ngcontent-c0会让BeautifulSoup去查找名为span__ngcontent-c0的自定义标签,这类标签在页面中不存在,自然拿不到结果。
解决方案
- 优先调用页面背后的结构化数据接口,稳定性最高、解析成本最低
打开目标页面后按F12调出开发者工具,切换到网络面板,筛选Fetch/XHR类型请求,刷新页面就能找到页面加载时拉取故事列表的接口,接口返回的是标准JSON格式数据,标题、发布日期、所属国家都是已经结构化好的字段,不需要解析HTML,直接遍历提取即可,示例代码逻辑如下:import requests import csv # 从浏览器网络面板抓到的故事列表数据接口 api_url = "对应接口地址" resp = requests.get(api_url) story_list = resp.json() # 遍历提取字段写入csv即可 for story in story_list["items"]: title = story["title"] pub_date = story["publication_date"] country = story["country_tag"] - 如果选择解析HTML方案,不要使用动态生成的
_ngcontent-*属性做定位依据
优先选择元素上固定的class属性、id属性,或者稳定的父级容器结构逐层向下查找目标元素。如果静态HTML里找不到目标内容,说明内容由JS动态渲染,可以换用Playwright、Selenium这类工具模拟浏览器加载完所有JS、完成DOM渲染后再做解析。
避坑提示
所有Angular自动生成的_ngcontent-*、_nghost-*属性都不要用作爬取定位规则,这类属性是框架编译生成的哈希标识,网站每次更新前端代码,属性名、属性值都可能发生变化,写好的规则会快速失效。
内容的提问来源于stack exchange,提问作者Salma Dodin
相关产品推荐
相关产品推荐

