首页 > 其他分享 >深入解析网页结构解析模块beautifulsoup

深入解析网页结构解析模块beautifulsoup

时间:2023-04-23 15:38:37浏览次数:47  
标签:网页 title beautifulsoup 节点 soup print 解析 find select


一声梧叶一声秋,一点芭蕉一点愁,三更归梦三更后。

大家好,我是Python进阶者,今天给大家分享一个网页结构解析模块beautifulsoup。

前言

beautifulsoup(以下简称bs),是一款网页结构解析模块,它支持传统的Xpath,css  selector 语法,可以说很强大了,下面我们就来着重介绍下它的用法。

安装

   bs 可以使用pip 或者easy_install安装,方便快捷。

pip install Beautifulsoup4

基本用法

一般就是先由requests 获取到网页源码后然后对页面进行解析,如图:

深入解析网页结构解析模块beautifulsoup_dom

这样就基本上拿到了页面的源码了。

1.根据标签直接获取元素,如下图:

深入解析网页结构解析模块beautifulsoup_列表_02

2.根据find,find_all方法查找

前者返回一个结果,后者返回所有结果

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


name :要查找的标签名(字符串、正则、方法、True)


attrs: 标签的属性


recursive: 递归


text: 查找文本


**kwargs :其它 键值参数

因为class是关键字,所以要写成class_="value", 等同于attrs={"class":"value"}

这里的参数适用于find find_all两种方法。

只不过find_all 还有其他参数,比如限制查找返回数量 的limit方法,标签内容string方法。

3.根据select方法查找

soup.select('div')

所有名为<div>的元素

soup.select('#aa')

所有 id 属性名为aa的元素

soup.select('.oo')

所有class 属性名为oo的元素

soup.select('div  p')

所有在<div>元素之内的<p>元素

soup.select('div >p')

所有直接在<div>元素之内的<p>元素,中间没有其他元素

soup.select('input[name]')

所有名为<input>,并有一个 name   属性,其值无所谓的元素

soup.select('input[type="button"]')

所有名为<input>,并有一个 type   属性,其值为 button 的元素

soup.select('a')[0].get_text() # 获取首个a元素的文本

soup.select('a')[0].attrs['href'] # 获取首个a元素的链接地址

4.关系节点名

find_parents()返回所有祖先节点的列表,find_parent()返回直接父节点


print(soup.title.find_parent())


print(soup.title.find_parent().find_all('link')[1])


print(soup.title.find_parents())


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


print(soup.title.find_next_sibling())


print(soup.title.find_next_siblings())


find_previous_siblings()返回前面所有兄弟节点的列表,find_previous_sibling()返回前面第一个兄弟节点


print(soup.title.find_previous_sibling())


print(soup.title.find_previous_siblings())


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


print(soup.title.find_next('link'))


print(soup.title.find_all_next('link'))


find_all_previous()返回节点前所有符合条件的节点, find_previous()返回节点前第一个符合条件的节点


print(soup.title.find_previous('link'))


print(soup.title.find_all_previous('link'))

5.对象种类

tag(标签)  navigablestring(标签内字符串)  beautifulsoup(对象)  comment(备注)


rep=requests.get('https://book.qidian.com/info/1014243481#Catalog',timeout=3)
soup=BeautifulSoup(rep.text,'html.parser')


print(soup.name)  #beautifulsoup 对象


tr=soup.div


print(type(tr),tr) #tag对象 标签


print(tr.get_attribute_list('class')) #获取属性对应列表


print(tr.a.string) #navigablestring 对象,获取标签内文字,可使用str()方法将她转换为unicode字符串
print(soup.a.string.replace_with('fdf')) #替换navigablestring

comment 即为提取的注释内容,一般被!--xxxxxxx--! 包裹的内容就是了

三、使用案例

爬取起点小说主页第一页所有小说名字和链接,如图:

深入解析网页结构解析模块beautifulsoup_dom_03

import requests
from bs4 import BeautifulSoup
rep=requests.get('https://www.qidian.com/all',timeout=3)
soup=BeautifulSoup(rep.text,'html.parser')
#按照步骤一步一步来爬取
ul=soup.find_all('ul','all-img-list cf')
for y in ul: 
    for z in y.find_all('div','book-mid-info'):
        for x in z.find_all('h4'):
            for v in x.find_all('a'):
                print(v.get_text(),'https:'+v.attrs['href']) #获取a标签的内容和href属性值

最后就可以得出正确结果,如图:

深入解析网页结构解析模块beautifulsoup_mooc_04

关于bs大致就这么多,大家学会了吗??

总结

今天就讲这么多,关于BS的强大之处,远不止于此,本文只是介绍了它的安装和基本用法,并通过一个案例来帮助大家加深理解,希望大家好好利用,在爬虫路上可以事倍功半!


标签:网页,title,beautifulsoup,节点,soup,print,解析,find,select
From: https://blog.51cto.com/u_13389043/6217695

相关文章

  • HTML5实现文件上传下载功能实例解析
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传  可以带参数        [HttpPost("upload")]        publicJsonResultuploadProject(I......
  • JavaScript实现文件上传下载功能实例解析
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......
  • AQS中的CyclicBarrier源码解析
    packagecn.com.pep;importjava.util.concurrent.BrokenBarrierException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/**......
  • JS实现文件上传下载功能实例解析.
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • ip addr命令解析
    1.ip addr命令使用解析ipaddr 命令是Linux系统中的一个网络管理工具,用于显示和配置系统中的网络接口及其地址信息。它可以列出系统中所有的网络接口及其详细信息,包括接口名称、MAC地址、IP地址、子网掩码、广播地址、网络类型、状态、传输单元大小等。ipaddr命令是Linu......
  • 关于python爬虫解析的问题
    在进行Python爬虫解析时,需要注意以下事项:1、良好的网站使用协议:需要遵守网站的robots.txt文件,以确保你的爬虫程序不会将网站拦截下来。2、编码问题:需要正确设置HTTP头和解析器的编码,以确保爬虫程序能够正确地解析网站的信息。3、数据解析:需要适当地处理HTML文档中的标签,以便从......
  • nginx解析漏洞
    Nginx漏洞复现与总结–FreeBuf网络安全行业门户1、文件解析漏洞描述:对于任意文件名,在后面添加/xxx.php后,即可作为php解析影响范围:该漏洞是nginx配置所导致,与版本无关。按照:phpStudy默认配置Nginx解析漏洞-漏洞复现/渗透测试/网络安全/信息安全/黑客技术-东塔网络安全学院_哔......
  • 91-云原生操作系统-Kubernetes网络通信常见架构及案例解析
    VxLAN技术演进VxLAN的技术演进二层通信-基于目标mac地址通信,不可夸局域网通信,通常是由接入交换机或汇聚交换机实现报文转发。VLAN(VirtualLocalAreaNetwork)-即虚拟局域网,是将一个物理(交换机)的网络在逻辑上划分成多个广播域的通信技术,VLAN内的主机间可以直接通信,而VLAN网络外......
  • UE5新功能StateTree源码解析
    StateTree是一种UE5中新增的通用分层状态机,其组合了行为树中的选择器(Selectors)与状态机中的状态(States)和过渡(Transitions)。用户可以创建非常高效、保持灵活且井然有序的逻辑。StateTree包含以树结构布局的状态。状态选择可以在树中的任意位置触发。相比行为树,其组织方式更......
  • 物联网---04.java对Modbus数据解析与对象互转
    一、Modbus互转代码1.实现代码@DatapublicclassModbusTools{/***modbus数据转对象*@paramdata串口数据*@paramdataType1代表16位读取2个byte数据,2代表32位读取4个byte数据*/publicstaticModbusDataAnalyzeBeandataAnalyze(by......