BeautifulSoup 利用Find_all()多级标签索引和获取标签中的属性内容

BeautifulSoup find、findall()多级索引详解(附例题)

  • BeautifulSoup库的安装:

命令行运行:

pip3 install beautifulsoup4

文章以以海南大学起点论坛为例

标准选择器

find_all()

find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

常用参数

  • name:标签名,使用html标签名来索引
sb = soup.find_all('img')
  • atters

可根据标签名、属性、内容查找文档。

使用双属性来查找元素:

content = html.find(attrs = {
    
    'class':'p_opt','id':'card_1550_menu_content'})

注意find_all()方法返回的是一个列表!访问列表的内容需要使用下标:

content[n]	#注意下标从0开始

而访问列表元素的下一级元素则使用:.contents[n]来访问(也是从0开始的)

content[n].contents[m]	#注意下标从0开始

嵌套查询:

嵌套查询很常用:

扫描二维码关注公众号,回复: 13195276 查看本文章

例子:

ul = html.find_all('ul')    #查找ul标签下的内容、嵌套选择
for li in ul:
    print(li.find_all('li')) #打印多个ul中的每一个

find()

find(name, attrs, recursive, text, wargs)

find用法和findall一模一样,但是返回的是找到的第一个符合条件的内容输出。注意find()方法返回的不是列表,而是一个单个元素对象,想要访问该对象的子元素就直接使用.contents[n]即可,不需要再添加下表

上面的代码对应的冗余代码:

from bs4 import BeautifulSoup
import urllib
from urllib import request

url = 'http://www.ihain.cn/forum.php?mod=guide&view=newthread'
headers ={
    
    }
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31'
req = request.Request(url,None,headers = headers)
response = request.urlopen(req)
# 获得response对象
html = BeautifulSoup(response,'html.parser')

多级索引:

这里我们以一个例子来讲解多级索引

查找目标:

列表中的“起点百事通文本”

在这里插入图片描述

对应的html:

在这里插入图片描述

我们通过索引来逐步得到我们想要的内容:

  • 这里为什么要一步一步来呢? 因为很多网站的HTML的属性都是比较冗余的,无法一次精确就查找到元素,通过逐步索引我们可以缩小我们的抖索范围,达到精确索引的目的

先找到div,再找到第一个子元素ul:

在这里插入图片描述

div = html.find('div',id = 'nv')

找到ul标签,这里我直接用.contents[1]没有索引到,但是用[3]索引到了,可能原因是存在一些不可见元素,我们随机应变

在这里插入图片描述

print(div[0].contents[3],'\n') #ul

ul标签的子元素索引:

在这里插入图片描述

我们逐步寻找内容,找到我们想要的:

在这里插入图片描述

先找到ul下第二个子元素

print(div[0].contents[3].contents[1])#ul下的第二个li

在这里插入图片描述

再在ul下第二个子元素的第一个子元素确定a标签

print(div[0].contents[3].contents[1].contents[0])#ul下的第二个li下的第一个内容即<a>标签及其内容

找到文本:
在这里插入图片描述

print(div[0].contents[3].contents[1].contents[0].text)  #<a>的文本内容(起点百事通)

最终通过.get()方法获取标签中属性的链接

print(div[0].contents[3].contents[1].contents[0].get('href'))   #对应的链接内容

上面代码对应的冗余代码:

from bs4 import BeautifulSoup
import urllib
from urllib import request

url = 'http://www.ihain.cn/forum.php?mod=guide&view=newthread'
headers ={
    
    }
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31'
req = request.Request(url,None,headers = headers)
response = request.urlopen(req)
# 获得response对象
html = BeautifulSoup(response,'html.parser')

至此 BeatifulSoup的find_all的查找基本上已经可以满足查找需求了 ,但是更方便查找的是Xpath等索引方式,这是另一种查找内容的方式,本篇不做介绍~

猜你喜欢

转载自blog.csdn.net/learner_syj/article/details/120590574