引入

  大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。因此,在聚焦爬虫中使用数据解析。所以,我们的数据爬取的流程为:

  • 指定url
  • 基于requests模块发起请求
  • 获取响应中的数据
  • 数据解析
  • 进行持久化存储

数据解析:

  - 被应用在聚焦爬虫。

  - 解析的数据存储在标签之间或者标签对应的属性中

BeautifulSoup解析

环境安装

  需要将pip源设置为国内源,阿里源、豆瓣源、网易源等

- windows

  • (1)打开文件资源管理器(文件夹地址栏中)
  • (2)地址栏上面输入 %appdata%
  • (3)在这里面新建一个文件夹  pip
  • (4)在pip文件夹里面新建一个文件叫做  pip.ini ,内容写如下即可
[global]
timeout = 6000
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com

 - linux

  • (1)cd ~
  • (2)mkdir ~/.pip
  • (3)vi ~/.pip/pip.conf
  • (4)编辑内容,和windows一模一样

- 需要安装:pip install bs4

bs4在使用时候需要一个第三方库,把这个库也安装一下

pip install lxml

- 环境安装:

pip install lxml

pip install bs4

解析原理

  • 实例化一个BeautifuSoup对象,然后将页面源码数据加载到该对象中;
BeautifulSoup(fp,'lxml')
BeautifulSoup(page_text,'lxml')
  • 调用该对象相关属性和方法进行标签定位和数据提取;

使用流程:

- 导包:from bs4 import BeautifulSoup

- 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容

(1)转化本地文件:

- soup = BeautifulSoup(open('本地文件'), 'lxml')

(2)转化网络文件:

- soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')

  (3)打印soup对象显示内容为html文件中的内容。打印的是加载到该对象的源码

from bs4 import BeautifulSoup

fp = open('./test.html','r',encoding='utf-8')
soup = BeautifulSoup(fp,'lxml')
print(soup)

相关属性和方法:

(1)根据标签名查找

  soup.tagName:定位到第一次出现的标签,只能找到第一个符合要求的标签

print(soup.div)

print(soup.p)

(2)获取属性

- soup.a.attrs       获取a所有的属性和属性值,返回一个字典

- soup.a.attrs['href']      获取href属性

- soup.a['href']         也可简写为这种形式

print(soup.a['href'])

3)获取内容直接将列表内容转换成字符串,是单数的。不需要join了

- soup.a.string

- soup.a.text

- soup.a.get_text()

【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容  

string:                # 直系
text,get_text(): # 所有
print(soup.p.string)

print(soup.p.text)

print(soup.p.get_text)

(4)find:找到第一个符合要求的标签,加第二个参数是属性定位,如果是class属性需要加一个下划线,否则会被认成关键字。其他的不需要。

soup.find('tagName',attrName="attrValue"):属性定位。返回值是单数

- soup.find('a')  找到第一个符合要求的

- soup.find('a', title="xxx")

- soup.find('a', alt="xxx")

- soup.find('a', class_="xxx")

- soup.find('a', id="xxx")

print(soup.find('div',class_='song'))

(5)find_all:找到所有符合要求的标签

- soup.find_all('a')

- soup.find_all(['a','b'])       找到所有的a和b标签

- soup.find_all('a', limit=2)     限制前两个

(6)根据选择器选择指定的内容。select选择器返回永远是列表,需要通过下标提取指定的对象  

  常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器

soup.select('#feng')
print(soup.select('.song'))

层级选择器:>表示一个层级,空格表示多个层级

层级选择器是不可以用索引的,而最后返回的列表的基础上是可以用索引的

print(soup.select('.tang li > a')[1])

print(soup.select('.song > a'))

案例

案例1:使用bs4实现将诗词名句网站中三国演义小说的每一章的内容爬去到本地磁盘进行存储 

 http://www.shicimingju.com/book/sanguoyanyi.html 

import requests
from bs4 import BeautifulSoup headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
} def parse_content(url):
#获取标题正文页数据
page_text = requests.get(url,headers=headers).text
soup = BeautifulSoup(page_text,'lxml') #解析获得标签
ele = soup.find('div',class_='chapter_content')
content = ele.text #获取标签中的数据值
return content if __name__ == "__main__":
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
reponse = requests.get(url=url,headers=headers)
page_text = reponse.text soup = BeautifulSoup(page_text,'lxml') #创建soup对象
a_eles = soup.select('.book-mulu > ul > li > a') #解析数据
print(a_eles)
cap = 1
for ele in a_eles:
print('开始下载第%d章节'%cap)
cap+=1
title = ele.string
content_url = 'http://www.shicimingju.com'+ele['href']
content = parse_content(content_url) with open('./sanguo.txt','w') as fp:
fp.write(title+":"+content+'\n\n\n\n\n')
print('结束下载第%d章节'%cap)
import requests
from bs4 import BeautifulSoup headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
page_text = requests.get(url=url,headers=headers).text #数据解析:章节标题,章节内容
soup = BeautifulSoup(page_text,'lxml')
a_list = soup.select('.book-mulu > ul > li > a')
fp = open('./sanguo.txt','w',encoding='utf-8')
for a in a_list: #把a标签当soup对象使用,因为它也是源码
title = a.string
detail_url = 'http://www.shicimingju.com'+a['href']
detail_page_text = requests.get(url=detail_url,headers=headers).text
soup = BeautifulSoup(detail_page_text,'lxml')
content = soup.find('div',class_="chapter_content").text # bs4中,把text提取出来的列表直接转换成字符串,与xpath不同 fp.write(title+':'+content+'\n')
print(title,'保存成功!')
fp.close()
print('over!')

a_list = soup.select('.book-mulu > ul > li > a')
print(a_list) # 一个个a标签

for a in a_list:                                    #把a标签当soup对象使用,因为它也是源码
title = a.string # 章节标题
print(title)

for a in a_list:
title = a.string
detail_url = 'http://www.shicimingju.com'+a['href'] # 章节url
print(detail_url)

for a in a_list:            #把a标签当soup对象使用,因为它也是源码
title = a.string
detail_url = 'http://www.shicimingju.com'+a['href']
detail_page_text = requests.get(url=detail_url,headers=headers).text
soup = BeautifulSoup(detail_page_text,'lxml')
content = soup.find('div',class_="chapter_content").text

最终生成文件

https://blog.csdn.net/qq_36381299/article/details/81000905

Python爬虫 | Beautifulsoup解析html页面的更多相关文章

  1. python爬虫数据解析之BeautifulSoup

    BeautifulSoup是一个可以从HTML或者XML文件中提取数据的python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. BeautfulSoup是python爬虫三 ...

  2. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  3. python爬虫网页解析之parsel模块

    08.06自我总结 python爬虫网页解析之parsel模块 一.parsel模块安装 官网链接https://pypi.org/project/parsel/1.0.2/ pip install ...

  4. python爬虫--数据解析

    数据解析 什么是数据解析及作用 概念:就是将一组数据中的局部数据进行提取 作用:来实现聚焦爬虫 数据解析的通用原理 标签定位 取文本或者属性 正则解析 正则回顾 单字符: . : 除换行以外所有字符 ...

  5. python爬虫数据解析之正则表达式

    爬虫的一般分为四步,第二个步骤就是对爬取的数据进行解析. python爬虫一般使用三种解析方式,一正则表达式,二xpath,三BeautifulSoup. 这篇博客主要记录下正则表达式的使用. 正则表 ...

  6. Python爬虫之解析网页

    常用的类库为lxml, BeautifulSoup, re(正则) 以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/ ...

  7. python爬虫之下载京东页面图片

    import requests from bs4 import BeautifulSoup import time import re t = 0 #用于给图片命名 for i in range(10 ...

  8. Python爬虫【解析库之beautifulsoup】

    解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulS ...

  9. Python爬虫html解析工具beautifulSoup在pycharm中安装及失败的解决办法

    1.安装步骤: 首先,你要先进入pycharm的Project Interpreter界面,进入方法是:setting(ctrl+alt+s) ->Project Interpreter,Pro ...

随机推荐

  1. VMware Workstation 15 Player使用centos页面版本如何查看ip

    首先运行要使用的centos镜像,输入密码登陆进去 因为是界面版,所以就不需要再镜像中输入命令,但是因为这样又找不到没法用ifconfig查看ip怎么办?  这个就是类似于一个系统页面版本的linux ...

  2. 创建包含CRUD操作的Web API接口5:实现Delete方法

    本节是前面四节的延续,在前面几节中我们创建了Web API并添加了必要的基础设施,实现了Get.Post.和Put方法.本节中,我们将介绍如何在Web API中实现Delete方法. 在RESTful ...

  3. 对一次 redis 未授权写入攻击的分析以及学习

    前段时间自己使用 redis 开发的时候,搞了一个 docker ,然后直接开放连接没有密码,其实一开始我就知道会被黑产扫到然后给我种马,但是把因为也是测试服务,其实也没怎么上心,于是就放任自由了,结 ...

  4. java之抽象类介绍

    什么抽象方法和抽象类 抽象方法 在类里面定义的没有方法体且用关键字“abstract”来修饰的方法就是抽象方法,所谓的没有方法体指的是在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名 ...

  5. Java知识回顾 (15) 文档注释

    说明注释允许你在程序中嵌入关于程序的信息. 你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中,使你更加方便的记录你的程序信息. javadoc 标签 标签 描述 示例 @auth ...

  6. JavaScript实现网页回到顶部效果

    在浏览网页时,当我们浏览到网页底部,想要立刻回到网页顶部时,这时候一般网页会提供一个回到顶部的按钮来提升用户体验,以下代码实现了该功能 HTML代码: <p id="back-top& ...

  7. 原生js 定义分页控件,类似于百度搜索

    实现一个类似于百度搜索结果的分页样式,样式可以自定义,接近于原生,少部分Jquery . 1.实现效果截图(默认无任何样式)  2.主要程序代码 define(function (require, e ...

  8. 一分钟告诉你什么是OPC DA质量代码

    [关于TOP Server OPC Server试用版可登录慧都网该产品下载页进行下载] OPC DA(OPC实时数据访问规范)定义了包括数据值,更新时间与数据品质信息的相关标准.这个定义相信大家都很 ...

  9. ABAP开发环境语法高亮的那些事儿

    关于SAP ABAP开发环境,Jerry之前写过几篇公众号文章: 那些年我用过的SAP IDE 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧 使用Visual Studio Code ...

  10. python基础-模块(全是理论,没有代码)

    模块 概念:一系列功能的结合体.相当于模块包着一堆函数与代码.本质上是py文件. 来源: python内置的模块----→ python解释器的模块 第三方的模块 -----→ 其他人编写提供的 自定 ...