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

Irene181
• 阅读 1809

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

前言

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

安装

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

pip install Beautifulsoup4 

基本用法

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

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

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

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

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

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') 所有名为
的元素
soup.select('#aa') 所有 id 属性名为aa的元素
soup.select('.oo') 所有class 属性名为oo的元素
soup.select('div p') 所有在
元素之内的

元素

soup.select('div >p') 所有直接在
元素之内的

元素,中间没有其他元素

soup.select('input[name]') 所有名为,并有一个 name 属性,其值无所谓的元素
soup.select('input[type="button"]') 所有名为,并有一个 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

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

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

总结

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

**-----**------**-----**---**** End **-----**--------**-----**-****

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

往期精彩文章推荐:

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

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/jOfka8WJL4T6QEOWYdaV-A,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
vue+element 表格formatter数据格式化并且插入html标签
前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
5个月前
爬取同样内容,xpath方法会比bs4要慢很多吗?
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【沐子山树】问了一个Python网络爬虫的问题,问题如下:爬取同样内容,xpath方法会比bs4要慢很多吗?二、实现过程这里【Kimi】给了个思路如下:爬取网页内容时,使用XPath和B
Python进阶者 Python进阶者
2年前
数据提取之JSON与JsonPATH
大家好,我是Python进阶者。背景介绍我们知道再爬虫的过程中我们对于爬取到的网页数据需要进行解析,因为大多数数据是不需要的,所以我们需要进行数据解析,常用的数据解析方式有正则表达式,xpath,bs4,这次我们来介绍一下另一个数据解析库jsonpath,在此之前我们需要先了解一下什么是json。一、初识JsonJSON(JavaScriptObjec
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这