python爬虫-数据解析(bs4)

python爬虫-数据解析(bs4)

python爬虫-数据解析(bs4)

基本知识概念

数据解析原理:

  1. 标签定位
  2. 提取标签、标签属性中存储的数据值

bs4数据解析原理:

  • 1.实例化一个BeautifulSoup对象,并且将页面原码数据加载到该对象中
  • 2.通过调用BeautifulSoup对象中相关的属性或方法进行标签定位和数据提取

环境安装:

pip install bs4

pip install lxml

如何实例化BeautifulSoup对象:

  • from bs4 import BeautifulSoup
  • 对象的实例化:

1.将本地的html文档中的数据加载到该对象中

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

2.将互联网上获取的页面源码加载到该对象中

page_text = response.text
soup = BeautifulSoup(page_text,'lxml')

提供的用于数据解析的方法和属性:

- soup. tagName :返回的是文档中第一次 出现的tagName对应的标签

- soup. find() :
	- find( ' tagName ' ) :等同于soup. div
	- 属性定位:
		- soup. find( 'div' ,class_ , id/attr= ' song' ) 
	- soup. find_ all( 'tagName i ) :返回符合要求的所有标签(列表)
	
- select: 
	- select( '某种选择器(id, class, 标签...选择器) ' ),返回的是一个列表 。
	- 层级选择器: 
		- soup. select('.tang > ul > li > a'): >表示的是一个层级
		- oup. select(' .tang > ul a'): 空格表示的多个层级
		
- 获取标签之间的文本数据:
	- soup.a. text/string/get_ text( )
	- text/get_ text() :可以获取某一个标签中所有的文本内容
	- string:只可以获取该标签下面直系的文本内容
	
- 获取标签中属性值:
	- soup.a['href']

bs4实例 —— 爬取三国演义所有章节

需求:爬取三国演义所有章节

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

from bs4 import BeautifulSoup
import requests
if __name__ == '__main__':
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(url=url,headers=headers).text
    soup = BeautifulSoup(page_text,'lxml')
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./三国演义小说.txt','w',encoding='utf-8')
    for li in li_list:
        title = li.a.string
        detail_url = 'https://www.shicimingju.com'+li.a['href']
        detail_page_text = requests.get(url=detail_url,headers=headers).text
        detail_soup = BeautifulSoup(detail_page_text, 'lxml')
        div_tag = detail_soup.find('div',class_='chapter_content')
        content = div_tag.text
        fp.write('\n' + title + ':' + content +'\n')
        print(title,'爬取成功')

发现出现乱码
在这里插入图片描述

response.text以文本格式查看的时候有乱码,可能是返回的内容被压缩了,这里修改一下
response.content.decode(“utf-8”) 按utf-8格式输出

from bs4 import BeautifulSoup
import requests
if __name__ == '__main__':
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(url=url,headers=headers).content.decode("utf-8")
    soup = BeautifulSoup(page_text,'lxml')
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./三国演义小说.txt','w',encoding='utf-8')
    for li in li_list:
        title = li.a.string
        detail_url = 'https://www.shicimingju.com'+li.a['href']
        detail_page_text = requests.get(url=detail_url,headers=headers).content.decode("utf-8")
        detail_soup = BeautifulSoup(detail_page_text, 'lxml')
        div_tag = detail_soup.find('div',class_='chapter_content')
        content = div_tag.text
        fp.write('\n' + title + ':' + content +'\n')
        print(title,'爬取成功')

效果图

在这里插入图片描述

练习2—爬取多情剑客无情剑小说所有章节

https://www.gulongwang.com/duo/

from bs4 import BeautifulSoup
import requests

if __name__ == '__main__':
    url = 'https://www.gulongwang.com/duo/'
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    page_text = requests.get(url=url,headers=headers).content.decode('GBK')
    soup = BeautifulSoup(page_text,'lxml')
    li_list = soup.select('.lb > ul > li')
    fp = open('./多情剑客无情剑.txt','w',encoding='utf-8')
    for li in li_list:
        title = li.a.string
        detail_url = 'https://www.gulongwang.com/'+li.a['href']
        detail_page_text = requests.get(url=detail_url,headers=headers).content.decode('GBK')
        detail_soup = BeautifulSoup(detail_page_text,'lxml')
        div_tag = detail_soup.find('div', class_='nr_con')
        content = div_tag.text
        fp.write('\n'+title+content+'\n')
        print(title,'爬取成功')

效果图

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100110.html原文链接:https://javaforall.net

(0)
上一篇 2021年4月15日 下午8:00
下一篇 2021年4月15日 下午10:00


相关推荐

  • 函数类型_C语言函数类型

    函数类型_C语言函数类型函数类型在ECMAScript中有三种函数类型:函数声明,函数表达式和函数构造器创建的函数。每一种都有自己的特点。1.函数声明这种函数类型的主要特点在于它们仅仅影响变量对象。该特点也解释了第二

    2022年8月5日
    9
  • Python正则匹配数字和小数

    Python正则匹配数字和小数正则匹配数字,\为转义字符,d+为匹配一次或多次如下所示:返回的结果为列表  2.正则匹配小数如下所示,返回的结果125.6为字符串 

    2022年6月17日
    44
  • JavaScript像数组添加元素并排序「建议收藏」

    JavaScript像数组添加元素并排序「建议收藏」最近用jscharts做图如上图,柱形排列是没有规律的,将它做出如下调整因为jscharts做表,是使用数组存储数据//准备数据varmyData=newArray([‘Asia’,437,520],[‘Europe’,322,390],[‘NorthAmerica’,233,286],[‘LatinAmerica’,110,162],[‘Afric

    2022年5月2日
    41
  • keepalived 防火墙配置

    keepalived 防火墙配置今天搭建了个 nginx keepalived 主从负载均衡 在怎么让前端两台 nginx keepalived 通信上 很纠结 按照网上教程部署后 无法通过 vip 进行主从服务器的切换 排查原因 排查了一下午 才发现 当防火墙关闭后 主从服务器 ninx 页面切换溜溜的 启动防火墙后 无法切换 也无法访问 郁闷 原来是防火墙的原因 在网上查了资料后才知道 原来 vrrp 协议是需要配置的 找到一篇可用的

    2026年3月19日
    1
  • c语言define的用法

    c语言define的用法1 define 的简单定义作用 define 相当于一个简单的文本替换 对于普通的常量定义 我就不必多说了 但是对于类似于函数定义的形式 可能会出现错误 例如 defineAdd x y x y 用到代码中时会出现问题 比如计算式子 c Add x y d 本意是计算出 x 与 y 的和之后在分别与 c d 做乘积 可是因为 define 仅仅相当于一个简单的文本替换 所以真实的计算

    2025年8月25日
    6
  • Java虚拟机:class类文件结构

    Java虚拟机:class类文件结构

    2021年9月26日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号