Python爬虫(五)数据解析—ps4

110 阅读3分钟

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

个人觉得,可能还是图形界面管理相对方便一点

assssss.png

四:如何实例化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