当前位置 博文首页 > python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门
【python爬虫基础入门】系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高
BeautifulSoup库在python中被美其名为“靓汤”,它和和 lxml 一样也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,若在没用安装此库的情况下, Python 会使用 Python默认的解析器lxml,lxml 解析器更加强大,速度更快,而BeautifulSoup库中的lxml解析器则是集成了单独的lxml的特点,使得功能更加强大。
需要注意的是,Beautiful Soup已经自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。因此在使用它的时候不需要考虑编码方式,仅仅需要说明一下原始编码方式就可以了。
使用pip命令工具安装BeautifulSoup4库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ BeautifulSoup # 使用清华大学镜像源安装
在代码中 html.parser
是一种针对于html网页页面的解析器,Beautiful Soup库还有其他的解析器,用于针对不同的网页
demo = 'https://www.baidu.com' soup = BeautifulSoup(demo,'html.parser')
解析器 | 使用方法 | 条件 |
---|---|---|
bs4的html解析器 | BeautifulSoup(demo,‘html.parser') | 安装bs4库 |
lxml的html解析器 | BeautifulSoup(demo,‘lxml') | pip install lxml |
lxml的xml解析器 | BeautifulSoup(demo,‘xml') | pip install lxml |
html5lib的解析器 | BeautifulSoup(demo,‘html5lib') | pip install html5lib |
假如有一个简单的网页,提取百度搜索页面的一部分源代码为例
<!DOCTYPE html> <html> <head> <meta content="text/html;charset=utf-8" http-equiv="content-type" /> <meta content="IE=Edge" http-equiv="X-UA-Compatible" /> <meta content="always" name="referrer" /> <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min. css" rel="stylesheet" type="text/css" /> <title>百度一下,你就知道 </title> </head> <body link="#0000cc"> <div > <div > <div > <div > <a href="http://news.baidu.com" rel="external nofollow" rel="external nofollow" name="tj_trnews">新闻 </a> <a href="https://www.hao123.com" rel="external nofollow" name="tj_trhao123">hao123 </a> <a href="http://map.baidu.com" rel="external nofollow" name="tj_trmap">地图 </a> <a href="http://v.baidu.com" rel="external nofollow" name="tj_trvideo">视频 </a> <a href="http://tieba.baidu.com" rel="external nofollow" name="tj_trtieba">贴吧 </a> <a href="//www.baidu.com/more/" rel="external nofollow" name="tj_briicon" >更多产品 </a> </div> </div> </div> </div> </body> </html>
结合requests库和使用BeautifulSoup库的html解析器,对其进行解析有如下
import requests from bs4 import BeautifulSoup # 使用Requests库加载页面代码 r = requests.get('https://www.baidu.com') r.raise_for_status() # 状态码返回 r.encoding = r.apparent_encoding demo = r.text # 使用BeautifulSoup库解析代码 soup = BeautifulSoup(demo,'html.parser') # 使用html的解析器 print(soup.prettify()) # prettify 方式输出页面
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,BeautifulSoup库有针对于html的标签数的特定元素,重点有如下三种
<p > ... </p>
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾,格式:soup.a或者soup.p(获取a标签中或者p标签中的内容) |
Name | 标签的名字,
… 的名字是‘p' 格式为:.name |
Attributes | 标签的属性,字典形式组织,格式:.attrs |
NavigableString | 标签内非属性字符串,<>…</>中的字符串,格式:.string |
Comment | 标签内的字符串的注释部分,一种特殊的Comment类型 |
标签是html中的最基本的信息组织单元,使用方式如下
from bs4 import BeautifulSoup html = 'https://www.baidu.com' bs = BeautifulSoup(html,"html.parser") print(bs.title) # 获取title标签的所有内容 print(bs.head) # 获取head标签的所有内容 print(bs.a) # 获取第一个a标签的所有内容 print(type(bs.a)) # 类型
在Tag标签中最重要的就是html页面中的name哈attrs属性,使用方式如下
print(bs.name) print(bs.head.name) # head 之外对于其他内部标签,输出的值便为标签本身的名称 print(bs.a.attrs) # 把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。 print(bs.a['class']) # 等价 bs.a.get('class') 也可以使用get方法,传入属性的名称,二者是等价的 bs.a['class'] = "newClass" # 对这些属性和内容进行修改 print(bs.a) del bs.a['class'] # 对这个属性进行删除 print(bs.a)
NavigableString中的string方法用于获取标签内部的文字
from bs4 import BeautifulSoup html = 'https://www.baidu.com' bs = BeautifulSoup(html,"html.parser") print(bs.title.string) print(type(bs.title.string))
Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号,用于输出注释中的内容
from bs4 import BeautifulSoup html = 'https://www.baidu.com' bs = BeautifulSoup(html,"html.parser") print(bs.a) # 标签中的内容<a href="http://news.baidu.com" rel="external nofollow" rel="external nofollow" name="tj_trnews"><!--新闻--></a> print(bs.a.string) # 新闻 print(type(bs.a.string)) # <class 'bs4.element.Comment'>
在HTML中有如下特定的基本格式,也是构成HTML页面的基本组成成分
而在这种基本的格式下有三种基本的遍历流程
三种种遍历方式分别是从当前节点出发。对之上或者之下或者平行的格式以及关系进行遍历
下行遍历有三种遍历的属性,分别是
属性 | 说明 |
---|---|
.contents | 子节点的列表,将所有儿子节点存入列表 |
.children | 子节点的迭代类型,用于循环遍历儿子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
使用举例
soup = BeautifulSoup(demo,'html.parser') # 循环遍历儿子节点 for child in soup.body.children: print(child) # 循环遍历子孙节点 for child in soup.body.descendants: print(child) # 输出子节点的列表形式 print(soup.head.contents) print(soup.head.contents[1]) # 用列表索引来获取它的某一个元素
上行遍历有两种方式
属性 | 说明 |
---|---|
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点,返回一个生成器 |
soup = BeautifulSoup(demo,'html.parser') for parent in soup.a.parents: if parent is None: parent(parent) else: print(parent.name)
平行遍历有四种属性
属性 | 说明 |
---|---|
.next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照html文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照html文本顺序的前序所有平行节点标签 |
平行遍历举例如下
for sibling in soup.a.next_sibling: print(sibling) # 遍历后续节点 for sibling in soup.a.previous_sibling: print(sibling) # 遍历
属性 | 说明 |
---|---|
.strings | 如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历 |
.stripped_strings | 与strings用法一致,可以去除掉那些多余的空白内容 |
.has_attr | 判断Tag是否包含属性 |
使用soup.find_all(name,attrs,recursive,string,**kwargs)
方法,用于返回一个列表类型,存储查找的结果
如果是指定的字符串:会查找与字符串完全匹配的内容,如下
a_list = bs.find_all("a") print(a_list) # 将会返回所有包含a标签的内容
如果是使用正则表达式:将会使用BeautifulSoup4中的search()方法来匹配内容,如下
from bs4 import BeautifulSoup import re html = 'https://www.baidu.com' bs = BeautifulSoup(html,"html.parser") t_list = bs.find_all(re.compile("a")) for item in t_list: print(item) # 输出列表
如果传入一个列表:BeautifulSoup4将会与列表中的任一元素匹配到的节点返回,如下
t_list = bs.find_all(["meta","link"]) for item in t_list: print(item)
如果传入一个函数或者方法:将会根据函数或者方法来匹配
from bs4 import BeautifulSoup html = 'https://www.baidu.com' bs = BeautifulSoup(html,"html.parser") def name_is_exists(tag): return tag.has_attr("name") t_list = bs.find_all(name_is_exists) for item in t_list: print(item)
并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data属性,用于指定属性搜索
t_list = bs.find_all(data-foo="value")
通过通过string参数可以搜索文档中的字符串内容,与name参数的可选值一样,string参数接受字符串,正则表达式,列表
from bs4 import BeautifulSoup import re html = 'https://www.baidu.com' bs = BeautifulSoup(html, "html.parser") t_list = bs.find_all(attrs={"data-foo": "value"}) for item in t_list: print(item) t_list = bs.find_all(text="hao123") for item in t_list: print(item) t_list = bs.find_all(text=["hao123", "地图", "贴吧"]) for item in t_list: print(item) t_list = bs.find_all(text=re.compile("\d")) for item in t_list: print(item)
使用find_all()方法的时,常用到正则表达式的形式import re
如下所示
soup.find_all(sring = re.compile('pyhton')) # 指定查找内容 # 或者指定使用正则表达式要搜索的内容 sring = re.compile('pyhton') # 字符为python soup.find_all(string) # 调用方法模板
此文列举了BeautifulSoup库在爬虫中的基本使用,不正确之处望指教,参考
jsjbwy深圳SEO优化公司海口百度标王报价邵阳SEO按天收费哪家好宣城百度标王公司甘孜网站建设哪家好阿坝优秀网站设计推荐南充网站优化按天收费推荐襄阳网站优化按天扣费报价迁安百搜标王哪家好平顶山外贸网站建设哪家好莆田网络推广多少钱清徐关键词按天扣费推荐雅安企业网站建设报价陇南网站推广方案价格盐城网页制作公司湘潭企业网站设计报价广安网页制作报价沧州百度seo多少钱濮阳至尊标王报价梧州设计公司网站价格仙桃网站建设价格思茅网页制作多少钱德宏网站优化按天计费价格平凉阿里店铺运营公司贵港网站排名优化哪家好南京百度网站优化石家庄seo网站推广公司南阳网站建设设计诸城企业网站制作玉林百度爱采购推荐福州网络推广公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运