BeautifulSoup如何区分同一div下用途不同的同名p标签

问题说明
当前编写的BeautifulSoup爬取解析代码如下:
for j in links: Title = j.find('p').text.strip() Narration = j.find('p').text.strip() Link = j.find('a')['href'].strip() Date = j.find('time').text[-14:-1].strip() Label = '1'
运行代码时存在问题:同一父div节点下有2个同层级的<p>标签,分别对应需要提取的新闻标题(Title)、新闻叙述内容(Narration),但find('p')的写法仅会返回第一个匹配的p节点,无法分别提取两个p标签的内容,预期提取结果为:
Title = News Title Narration = News Narration
可行解决方法
以下三种方法都可以实现同层级p标签的区分提取,根据实际页面结构选择即可:
- 按标签顺序提取:使用
find_all('p')获取当前节点下所有p标签的列表,按下标取值
这是同层级固定顺序标签最简便的提取方式:for j in links: p_list = j.find_all('p') # 增加长度判断避免索引越界报错 if len(p_list) >= 2: Title = p_list[0].text.strip() Narration = p_list[1].text.strip() else: # 结构异常时的兜底逻辑,可根据需求调整 Title = "" Narration = "" Link = j.find('a')['href'].strip() Date = j.find('time').text[-14:-1].strip() Label = '1' - 按标签属性精准定位:如果两个p标签带有不同的class、id或其他自定义属性,直接在find时传入属性筛选条件,稳定性更高,不会受标签顺序变动影响
示例(假设标题p带有class="title"属性、描述p带有class="desc"属性):for j in links: Title = j.find('p', class_='title').text.strip() Narration = j.find('p', class_='desc').text.strip() Link = j.find('a')['href'].strip() Date = j.find('time').text[-14:-1].strip() Label = '1' - 用CSS选择器定位:通过
select_one方法搭配CSS伪类选择器,按位置匹配对应p标签for j in links: # 匹配父节点下第一个p标签 Title = j.select_one('p:nth-of-type(1)').text.strip() # 匹配父节点下第二个p标签 Narration = j.select_one('p:nth-of-type(2)').text.strip() Link = j.find('a')['href'].strip() Date = j.find('time').text[-14:-1].strip() Label = '1'
优先推荐按标签属性定位的方案,抗页面结构变动能力最强;如果p标签没有任何区分属性,再选择按顺序提取的方案。
内容的提问来源于stack exchange,提问作者AccelUp
相关产品推荐
相关产品推荐

