c爬虫抓取网页数据(Python对象的bs4解析方式和属性的方法和方法)
优采云 发布时间: 2022-04-13 09:39c爬虫抓取网页数据(Python对象的bs4解析方式和属性的方法和方法)
bs4,全称BeautifulSoup 4,是Python独有的解析方式。也就是说,只有 Python 语言可以这样解析数据。
BeautifulSoup 3 只支持 Python 2,所以它已经过时了。
官网的介绍是这样的
Beautiful Soup 提供了简单的类似 python 的函数来处理导航、搜索、修改解析树等。它是一个工具箱,通过解析文档为用户提供他们需要抓取的数据。由于其简单性,编写完整的应用程序不需要太多代码。Beautiful Soup 自动将输入文档转换为 Unicode 编码,将输出文档自动转换为 utf-8 编码。不需要考虑编码方式,除非文档没有指定编码方式,否则Beautiful Soup无法自动识别编码方式。然后,您只需要指定原创编码。Beautiful Soup 已经成为与 lxml 和 html6lib 一样优秀的 python 解释器,为用户提供不同解析策略的灵活性或强大的速度。
看起来很复杂,我用自己的理解简单解释一下
我们知道一个网页的源代码是由多个标签组成的,比如,
,,,等等,而bs4是用来帮助我们准确定位标签位置的工具,从而获取标签的内容或标签属性。bs4默认自带的解析器,但官方推荐的是更强大更快的lxml解析器
其他解析器的优缺点
一、bs4的安装
pip install bs4
pip install lxml
用bs4解析时,推荐使用lxml解析器。使用 xpath 解析时也会用到
二、bs4解析原理1、如何实例化BeautySoup对象 导入bs4包
from bs4 import BeautifulSoup
湾。实例化对象
网页源代码进一步分为本地已经持久化的HTML文件和网络上直接获取的源代码。
如果是本地持久化文件,可以通过如下方式将源码加载到bs4对象中
fp = open('xxx.html', 'r', encoding='utf-8')
# lxml:解析器
soup = BeautifulSoup(fp, 'lxml')
如果是通过requests库获取的网页源代码,按如下方式加载
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
C。数据解析的方法和属性
bs4 能够将复杂的 HTML 转换为树结构,其中每个节点都是一个 Python 对象。
soup.tagName(标签名):返回文档中第一次出现tagName对应的标签及其对应的内容
soup.tageName1.tageName2:返回tag1中tag1的标签和内容
soup.find:等价于soup.tagName,返回第一个匹配的对象
soup.find_all:返回所有匹配的对象。
通过查看源码你会发现find的本质就是调用find_all然后返回第一个元素
参数说明:
def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-iXUox6yw-53)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-23454< @0.png )]
上图是我从某网站中截取的部分画面,翻译成HTML如下(只保留对本次分析有用的部分,删除地址的域名信息为阅读方便)
测试Title
<p>尼古拉斯赵四

郑爽

朱一龙

周冬雨

胡一天

易烊千玺

迪丽热巴
</p>
看下面的例子
# 获取第一个li标签
# <p>郑爽
print(soup.li)
# # 获取第一个li标签中a标签
# 
郑爽
print(soup.li.a)
#获取第一个li标签中a标签
print(soup.find('li').a)
# 获取所有li标签
print(soup.find_all('li'))
# 获取title标签
print(soup.title)
# 获取a标签的父级标签
print(soup.a.parent)
# 获取a标签的父级标签的名字
print(soup.a.parent.name)</p>
如何在 HTML 中获取href?
分析:href是a标签中的一个属性,a标签在li标签中
提取bs4中tags中的属性可以通过attrs获取
其他补充剂
# 返回子孙节点
# children返回迭代器
result = soup.a.children
for i in result:
print(i)
# 返回子孙节点, contents返回列表
r = soup.a.contents
print(r)
# 可以通过正则对某个属性进行匹配
# 比如返回href中以zh开头的标签
import re
reg = re.compile('^zh')
result = soup.find_all(href=reg)
print(result)
选择器
bs4 非常强大,也支持 css 选择器。通过选择完成
测试Title
<p>尼古拉斯赵四

郑爽

朱一龙

周冬雨

胡一天

易烊千玺

迪丽热巴
</p>
from bs4 import BeautifulSoup
fp = open('baidu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# 返回一个所有a标签的列表
result = soup.select('a')
# 返回第一个
result1 = soup.select('a')[0]
"""
class选择器 : .className
"""
# 一层一层的进行选择,用 > 连接 即 > : 表示一个层级
# 输出 class = nr_zt 下ul下的li下的a标签集合
a = soup.select('.nr_zt > ul > li > a')
# 多个层级关联,使用 空格。
# 输出 class= 'nr_zt' 下的a标签集合
b = soup.select('.nr_zt a')
"""
id选择器: # idName
"""
result = soup.select('#star')
# 通过href属性查找,返回列表
soup.select('a[href="zhengshuang.html"]')
# 获取对应标签中img标签的src值
a = soup.select('a[href="zhengshuang.html"]')[0]
print(a.img['src']) # 5940f2cd6b759.jpg
以上是bs4的常用操作代码。其实在具体的爬取过程中,匹配的方式比较灵活,大家不用死记硬背,记住原理即可。
网络爬虫
Python