c爬虫抓取网页数据(Python对象的bs4解析方式和属性的方法和方法)

优采云 发布时间: 2022-04-13 09:39

  c爬虫抓取网页数据(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

![](123456789.jpg)<p>尼古拉斯赵四

![](5940f2cd6b759.jpg)

  郑爽

![](5b56e0fabf5bf.jpg)

  朱一龙

![](5a28b93be8155.jpg)

  周冬雨

![](5aa36dfbe5f61.jpg)

  胡一天

![](5a28d243b0382.jpg)

  易烊千玺

![](5a28b69334087.jpg)

  迪丽热巴

</p>

  看下面的例子

  # 获取第一个li标签

# ![](http://pic1.win4000.com/tj/2017-06-14/5940f2cd6b759.jpg)<p>郑爽

print(soup.li)

# # 获取第一个li标签中a标签

# ![](http://pic1.win4000.com/tj/2017-06-14/5940f2cd6b759.jpg)

  郑爽

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

![](123456789.jpg)<p>尼古拉斯赵四

![](5940f2cd6b759.jpg)

  郑爽

![](5b56e0fabf5bf.jpg)

  朱一龙

![](5a28b93be8155.jpg)

  周冬雨

![](5aa36dfbe5f61.jpg)

  胡一天

![](5a28d243b0382.jpg)

  易烊千玺

![](5a28b69334087.jpg)

  迪丽热巴

</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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线