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

BeautifulSoup详解

BeautifulSoup是Python爬虫常用的一个库,起到解析页面的功能。但是我们课上的老师没有把这个库详细的讲,所以我利用网上的资源自己整合一下,写一篇Blog来学习一下~

首先是BeautifulSoup库的安装:

命令行运行:

pip3 install beautifulsoup4

BeautifulSoup的解析器:
我们常用html.parser解析器

解析器 使用方法 优势
Python标准库 BeautifulSoup(response.read(), “html.parser”) Python的内置标准库、执行速度适中 、文档容错能力强 Python 2.7.3 or 3.2.2)前的版本中文容错能力差
lmxl HTML解析器 BeautifulSoup(response.read(), “lmxl”) 速度快、文档容错能力强 需要安装C语言库
lmxl XML解析器 BeautifulSoup(response.read(), “xml”) 速度快、唯一支持XML的解析器 需要安装C语言库
html5lib BeautifulSoup(response.read(), “html5lib”) 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展

标准选择器

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

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

部分常用方法

  • find
    find用法和findall一模一样,但是返回的是找到的第一个符合条件的内容输出。

  • find_parents(), find_parent()
    find_parents()返回所有祖先节点,find_parent()返回直接父节点。

  • find_next_siblings() ,find_next_sibling()
    返回后面的所有兄弟节点,2返回后面的第一个兄弟节点

  • find_previous_siblings(),find_previous_sibling()
    返回前面所有兄弟节点…

  • find_all_next(),find_next()
    返回节点后所有符合条件的节点,2返回后面第一个符合条件的节点

  • find_all_previous()和find_previous()

代码:

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')

ul = html.find_all('ul')    #查找ul标签下的内容、嵌套选择
for li in ul:
    print(li.find_all('li'))

# 属性选择:

titles = html.find_all(class_ = 'xst')
for title in titles:
    print(title.text)

# 使用find_all方法的atters参数定义一个字段参数来搜索多个属性

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

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

常用参数:

参数名 作用
name 查找标签
text 查找文本
atters 基于atters参数

**2. find_all **
返回所有匹配到的结果,区别于find(find只返回查找到的第一个结果)
语法:
find_all(name, attrs, recursive, text, limit, kwargs)

多级索引:

查找目标:

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

对应的html:

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

我们希望通过索引能够得到以下内容:

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

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

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

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

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

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

对应代码:

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')
#find_all索引多级标签:
div = html.find_all('div',id = 'nv')
#返回的div是一个列表

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

print(div[0].contents[3],'\n') #继续往下索引

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

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

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

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

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

如果本篇文章对你有帮助的话记得点个赞哦~

上一篇:maven父子项目,由于pom文件中的pom导致报数据源配置错误


下一篇:codeGenerator配置类(代码快速生成工具类)