爬虫笔记(十四)——BeautifulSoup库

Beautifulsoup库:

该库是python语言写的,主要功能是将html、xml格式的数据对象解析成“标签树”,并进行遍历和维护,即可以从网页抓取数据。

借鉴的html是妹子图网站的源代码http://www.meizitu.com/

安装

sudo apt-get install Python-bs4
pip install beautifulsoup4

导入模块

from bs4 import BeautifulSoup

创建对象

soup =BeautifulSoup(text,'html.parser')#前一个参数为要解析的文本,后一个参数为解析模型
# lxml的HTML解析器:BeautifulSoup(mk,'lxml')——pip install lxml
# lxml的XML解析器:BeautifulSoup(mk,'xml')——pip install lxml
# html5lib的解析器:BeautifulSoup(mk,'html5lib')——pip install html5lib

这里使用bs4的解析器。

解析后的四大对象类型

  1. Tag
  2. NavigableString
  3. BeautifulSoup
  4. Comment

(1)Tag

Tag 是HTML 中的一个个标签,是最基本的信息组成单元,分别用<>和</>表示开头和结尾。

Tag下又分为标签的名字和属性,分别用<tag>.name 、 <tag>.attrs来表示。比如下面的一个标签:

<img alt="妹子即便你不带我去哪,默默跟在" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/01/limg.jpg" width="64"/>

soup.img.name可得到img,soup.img.attrs得到{'src': 'http://mm.chinasareview.com/wp-content/uploads/2017a/07/01/limg.jpg', 'width': '64', 'alt': '妹子即便你不带我去哪,默默跟在', 'height': '64'}这样的字典。soup.img.attrs['src']可得到图片的链接http://mm.chinasareview.com/wp-content/uploads/2017a/07/01/limg.jpg。

print (soup.img.parent.name)#该标签的父标签的名字
#a 
print (soup.img.parent.parent.name)#该标签的父标签的父标签的名字
#li

(2)NavigableString

标签内非属性字符串,<>...</>中的字符串,格式:<tag>.string。

在上个标签示例中,他会返回None。下面以一个title标签来展示:

<title>妹子图 - 清纯美女,可爱美女,美女图片</title>

很明显这个标签的属性会返回一个空字典{},name是title,soup.title.string可以得到妹子图 - 清纯美女,可爱美女,美女图片的字样。

(3)BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性。

(4)Comment

Comment 对象是一个特殊类型的 NavigableString 对象,是标签内字符串的注释部分,以尖括号叹号表示注释开始:<! --This is a comment -->。

标签获取

根据表签名来获取所有符合的标签,返回一个列表。如soup('img')可得到如下:

[<img alt="妹子即便你不带我去哪,默默跟在" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/01/limg.jpg" width="64"/>, <img alt="Merry Christmas 圣诞的福利" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/limg.jpg" width="64"/>, <img alt="气质俏佳人,即便是小巷子也辣么" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/05/limg.jpg" width="64"/>, <img alt="送福利,祝大家2018年元旦快乐" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/02/limg.jpg" width="64"/>, <img alt="女神范十足!气质美女友希私房写" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/06/15/limg.jpg" width="64"/>, <img alt="能娶到打排球的女孩,简直就是走" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/17/limg.jpg" width="64"/>, <img alt="周末福利图,个个身材都超赞" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/09/limg.jpg" width="64"/>, <img alt="简直...不一样的可爱风,刮的你" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/08/limg.jpg" width="64"/>, <img alt="晚上拍照不美哒哒?看到这张图你" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/10/limg.jpg" width="64"/>, <img alt="做女人不管胖瘦美丑,最重要的是" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/06/13/limg.jpg" width="64"/>, <img alt="内涵图,为什么我遇不到这么好的" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/06/limg.jpg" width="64"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2018a/01/01/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/02/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/21/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/20/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/19/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/18/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/17/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/16/01.jpg" style="width:100%;"/>, <img src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/15/01.jpg" style="width:100%;"/>, <img alt="能娶到打排球的女孩,简直就是走" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/17/limg.jpg"/>, <img alt="超高颜值的同时不乏一丝性感,等" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/12/limg.jpg"/>, <img alt="这些完美翘臀真让人垂涎欲滴" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/16/limg.jpg"/>, <img alt="送福利,祝大家2018年元旦快乐" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/02/limg.jpg"/>, <img alt="张张令人血脉喷张,身材好到爆" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/18/limg.jpg"/>, <img alt="简直...不一样的可爱风,刮的你" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/08/limg.jpg"/>, <img alt="萌萌纯纯的,但你能从里面挑出哪" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/04/limg.jpg"/>, <img alt="Merry Christmas 圣诞的福利" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/limg.jpg"/>, <img alt="笑容是女人最美丽、最有效的武器" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/13/limg.jpg"/>, <img alt="妹子图重新开更:来一波美臀先" src="http://mm.chinasareview.com/wp-content/uploads/2018a/01/01/limg.jpg"/>, <img alt="周末福利图,个个身材都超赞" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/09/limg.jpg"/>, <img alt="美胸大作战,纸巾准备好" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/20/limg.jpg"/>]
print(tag.name),   #标签的名称
print(tag.attrs),  #属性
print(tag.string)  #标签内的文本显示
print(tag.get_text())   #获取标签内文本内容

搜索

用来查找标签元素:soup.find_all(name,attrs,string,**kwargs),返回一个列表类型的查找结果。

soup.find(name,attrs,string,**kwargs),直接返回满足的第一个结果。

(1)按标签查找

print (soup.find_all('img')[0]) #按字符串查询
#<img alt="妹子即便你不带我去哪,默默跟在" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/07/01/limg.jpg" width="64"/>
print (soup.find_all(re.compile("^img"))[0] ) #按正则表达式查询
print(soup.find_all(["a", "b"])[0])  #按列表查询
print(soup.find_all(True)[1])  #查询所有元素,第一个元素就是html元素,就是整个全文

(2)按属性查找

print (soup.find_all(alt="Merry Christmas 圣诞的福利")) #按属性值查询
#[<img alt="Merry Christmas 圣诞的福利" height="64" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/limg.jpg" width="64"/>, <img alt="Merry Christmas 圣诞的福利" src="http://mm.chinasareview.com/wp-content/uploads/2017a/08/01/limg.jpg"/>]

print(soup.find_all(href=re.compile("#")))  #按属性值的正则表达式查询
print(soup.find_all(href=re.compile(".*index\.html"), target='_blank'))  #按属性值列表查询
print(soup.find_all("a", class_="current"))  #标签属性联合搜索,class 是 python 的关键词,所以加了_
print(soup.find_all(attrs={"class": "current"}))  #搜索包含指定属性值的元素

(3)按文本查找

print(soup.find_all(text="首页"))  #按文本搜素,接受的参数与按标签搜索一样
print(soup.find_all("a", limit=2,recursive=False))  #以上所有搜索都可以用limit限定最大搜索到的数目,用recursive限定只搜索直接子节点

(4)按CSS选择器查找

print (soup.select("title"))#按名称
#[<title>妹子图 - 清纯美女,可爱美女,美女图片</title>]
print(soup.select('.current'))  #按类名
print(soup.select('#headerImg')) #按id
print(soup.select('li .current'))  #后代查询
print(soup.select("head > title")) #子标签查询
print(soup.select('a[class="current"]'))  #属性查询

猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/81570119
今日推荐