使用bs4
(BeautifulSoup
)
数据解析的作用?
用来实现聚焦爬虫
网页中显示的数据都是存储在那里的?
都是存储在html
的标签中或者是标签的属性中
数据解析的通用原理是什么?
指定标签的定位取出标签中存储的数据或者标签属性中的数据
bs4
解析原理
实例化一个BeautifulSoup
对象,且待解析的页面源码数据加载到该对象中调用BeautifulSoup
对象中相关方法或者属性进行标签定位和文本数据的提取
环境的安装
pip install lxml #解析器pip install bs4
BeautifulSoup
对象的实例化:
BeautifulSoup(file,'lxml')
用来将本地存储的html
文档中的数据进行解析BeautifulSoup(page_text,'lxml')
用来将互联网上请求的页面源码数据进行解析
我们来看这段test.html
源码:
<html lang="en"><head><meta charset="UTF-8"><title>测试bs4</title></head><body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="/" title="赵匡胤" target="_self"><span>this is span</span>宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能蔽日,长安不见使人愁</a><img src="/meinv.jpg" alt=""/></div><div class="tang"><ul><li><a href="" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="" class="du">杜甫</a></li><li><a href="" class="du">杜牧</a></li><li><b>杜小月</b></li><li><i>度蜜月</i></li><li><a href="" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li></ul></div>
bs4
的使用:
from bs4 import BeautifulSoupfile = open('./test.html', 'r', encoding='utf-8')soup = BeautifulSoup(file, 'lxml')soup # 打印出完整页面源码
标签定位:
soup.tagName
:只可以定位到第一次出现的tagName标签
soup.p # <p>百里守约</p>
属性定位
soup.find('tagName',attrName=value)
:定位到第一次出现的tagName
标签
举例:
soup.find('div', class_='song') # 注意class 后面有 _
打印结果:
<div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="/" target="_self" title="赵匡胤"><span>this is span</span>宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a class="du" href="">总为浮云能蔽日,长安不见使人愁</a><img alt="" src="/meinv.jpg"/></div>/
soup.find('a', id='feng')
打印结果:
<a href="" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a>
# soup.findAll:跟find一样作属性定位,只不过findAll返回的是列表,定位到所有满足条件的标签soup.findAll('a', id='feng')
打印结果:
[<a href="" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a>]
选择器定位:soup.selec
t(‘选择器’)
类选择器
id选择器
层级选择器
>
大于号 表示一个层级
soup.select('.tang > ul > li')
空格表示隔多个层级
soup.select('.tang li')
其结果都是:
[<li><a href="" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a alt="qi" href="">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a class="du" href="">杜甫</a></li><li><a class="du" href="">杜牧</a></li><li><b>杜小月</b></li><li><i>度蜜月</i></li><li><a href="" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>]
取数据
.text
:返回的是该标签下所有的文本内容
.string
:返回的是该标签直系的文本内容
a_tag = soup.find('a', id='feng')# <a href="" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a>a_tag.texta_tag.string
打印结果:
凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘
# 另一个例子a_tag=soup.find('div',class_='song')a_tag.strings'''<generator object Tag._all_strings at 0x00000200F390BAC0>''' # 不同的编译器显示不同a_tag.text'''李清照王安石苏轼柳宗元this is span宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱总为浮云能蔽日,长安不见使人愁'''
取属性
a_tag['attrName']
a_tag.a['attrName']
a_tag['class']# 打印结果 ['song']a_tag.a['href']# 打印结果 /