bs4是Python特有,bs4只支持 属性定位,而不支持索引定位。
数据解析原理:
1.标签定位
2.提取标签、标签属性中存储的数据值
bs4数据解析原理:
1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
2.通过调用BeautifulSoup对象中相关的属性或方法进行标签定位和数据提取
环境安装:
pip install bs4
pip install lxml # lxml是解析器
如何实例化BeautifulSoup对象:
from bs4 import BeautifulSoup
对象的实例化:
1.将本地的html文件中的数据加载到该对象中
fp = open('./study.html','r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
print(soup)
2.将互联网中获取的页面源码加载到该对象当中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')
用于数据解析的方法和属性:
tagName指的是html的标签名称,比如:<p>,<html>,<a>,<table>等
1.soup.tagName
返回的是html文档中第一次出现的tagName标签对应的标签。
例如:
print(soup.p) # 会打印出html文档中第一次出现p标签
p_text = soup.p
2.soup.find()
find()有两种用法。
第一种用法:
soup.find('tagName'),等同于soup.tagName的用法,同样可以返回的是html文档中第一次出现的tagName标签对应的标签。
print(soup.find('a'))
第二种用法:属性定位
soup.find('tagName',标签属性)
tagName_text = soup.find('p',class_="title")
3.soup.find_all()用法
soup.find_all('tagName'),可以找到符合要求的所有内容,返回就是一个列表
4.soup.select()用法
4.1select('某种选择器标签')
返回一个列表,返回所有符合要求的标签内容。
soup.select(".title")
# .title等同于class = "title"
4.2层级选择器
用>作为划分层级分割,要从直系角度出发
list_text = soup.select('.title > ul > li > a')[0]
# list_text = soup.select('.title > ul > li > a')这返回的是一个列表,然后通过索引,获取字符串
html文档中包含多个li,a标签,但是只想获取第一个,而bs4只支持属性定位,不能索引定位,而且list_text返回的是表格形式,在获取表格形式之后利用索引是允许的。
4.3省略
利用空格,空格代表多个层级
list_text = soup.select(.title>ul a')[0]
标签定位为获取标签所存储的文本内容。
获取标签之间的文本内容的方法(两个属性一个方法)
1.soup.tagName.text
page_text = soup.select('.title>ul a')[0].text
2.soup.tagName.string
page_text = soup.select('.title>ul a')[0].string
3.soup.tagName.get_text()方法
page_text = soup.select('.title>ul a')[0].get_text()
三者区别:
text与get_text():
可以获取某一个标签中所有文本内容(该标签内包含的所有层级文本内容)
string:
只可以获取该标签下面直系的文本内容
获取标签中属性值的方法
page_value = soup.tagName['属性名称']