Bs4字符串解析是python独有的一种解析方式,只能在python语言中使用。
一:Bs4数据解析的原理:
1:标签定位
2:提取标签、标签属性中存储的数据值
二:Bs4数据解析的原理:
1:实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
2:通过调用BeautifulSoup对象中相关得的属性或者方法进行标签的定位和数据提取
三:环境安装
这里要强调一下:使用bs4进行数据解析,还需要使用到lxml模块。
推荐使用anconda来管理python环境
Windows安装anconda请移步《Python(三)开源的Python包管理器 anaconda——window安装》
Linux安装anconda请移步《Python(四)开源的Python包管理器 anaconda——linux安装》
也可以使用命令安装:
Pip install bs4
Pip install lxml
个人觉得,可能还是图形界面管理相对方便一点
四:如何实例化BeautifulSoup对象
1:将本地的html文档中的数据加载到该对象中
# 引入bs4模块
from bs4 import BeautifulSoup
import lxml
fp = open('./tuchong.html','r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
print(soup)
2:将互联网上获取到的数据加载到该对象化中
# 引入bs4模块
from bs4 import BeautifulSoup
import requests
# 1:指定url
url = "https://dl.ke.com/ershoufang/"
# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}
# 3:模拟网络请求链接
responce = requests.get(url=url, headers=headers)
# 4:获取响应数据
content = responce.text
# 5: bs4 解析
soup = BeautifulSoup(content,'lxml')
print(soup)
五:bs4提供的用于数据解析的方法和属性
1:soup.tagName(tagName为标签名称)返回的是html中首次出现的tagName标签
htmls = soup.a
print(htmls)
输出:
<a href="//www.ke.com/">首页</a>
2:soup.find 查找标签
(1):soup.find(tagName) 用法等同于soup.tagName
htmls = soup.find('a')
print(htmls)
输出:
<a href="//www.ke.com/">首页</a>
(2):soup.find(tagName,class_=’’) 通过class定位标签
htmls = soup.find('a',class_='selected')
print(htmls)
输出:
<a href="/ershoufang/" id="areaTab" title="大连二手房">
区域<span></span>
</a>
3:soup.findAll(tagName) 返回符合条件的所有标签(列表)同样也可以做属性定位
htmls = soup.findAll('a',class_='selected')
print(htmls)
输出:
[<a href="/ershoufang/" id="areaTab" title="大连二手房">
区域<span></span>
</a>]
4:soup.select()
(1):Select参数是某种选择器(class,id,tagName)返回符合条件的所有标签(列表)
htmls = soup.select('.selected')
print(htmls)
返回:
[<li>
<a href="https://dl.ke.com/ershoufang/">二手房</a>
</li>, <li data-action="click_name=在售" data-click-event="WebClick" data-click-evtid="31912" data-view-event="ItemExpo" data-view-evtid="31911">
<a href="/ershoufang/" title="大连在售二手房">在售</a>
</li>, <a href="/ershoufang/" id="areaTab" title="大连二手房">
区域<span></span>
</a>, <li>
<h3><a href="/ershoufang/">默认排序</a></h3>
</li>]
(2):select也可作为层级定位
层级选择器
一个大于号(>)代表一个层级
htmls = soup.select('.container > ul > li > a')[1]
print(htmls)
输出:
<a href="https://dl.ke.com/ershoufang/">二手房</a>
空格表示多个层级
htmls = soup.select('.container a')[1]
print(htmls)
输出:
<a href="https://dl.ke.com/ershoufang/">二手房</a>
5:获取标签之间的文本数据
string 只可获取标签下直系的文本内容
text/get_text() 可以获取某一个标签下所有的文本内容(直系+非直系)
htmls = soup.select('.container li')[1].text
print(htmls)
htmls = soup.select('.container li')[1].string
print(htmls)
htmls = soup.select('.container li')[1].get_text()
print(htmls)
输出:
二手房
None
二手房
6:获取标签中属性值
这个相对比较容易 soup.a[属性名称]
htmls = soup.select('.container a')[0]['href']
print(htmls)
输出:
//www.ke.com/
六:实际应用:
我这里将正则中爬取图片的例子使用bs4来实现一下:
# 引入bs4模块
from bs4 import BeautifulSoup
import requests
def getImage(url,num):
"""
:name 爬取网络图片
:param url: 图片url
:param num: 图片名称
:return: 无返回值
"""
# 1:指定url
# url = "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg"
# 2:模拟网络请求链接
responce = requests.get(url=url)
# 3:获取响应数据,content获取二进制数据
content = responce.content
filename = './img/'+ str(num) +'.jpg'
# 4:持久化存储
with open(filename, 'wb') as fe:
fe.write(content)
print('爬取完成')
# 1:指定url
url = "https://dl.ke.com/ershoufang/"
# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}
# 3:模拟网络请求链接
responce = requests.get(url=url, headers=headers)
# 4:获取响应数据
content = responce.text
# 5: bs4 解析
soup = BeautifulSoup(content,'lxml')
htmls = soup.select('.lj-lazy')
i = 0
for it in htmls:
src = it['data-original']
getImage(src, i)
print('爬取完成!')
以上大概就是 python中 bs4的使用。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客 guanchao.site