pytho爬虫使用bs4 解析页面和提取数据
页面解析和数据提取
关注公众号“轻松学编程”了解更多。
一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为两部分,非结构化的数据 和 结构化的数据。
- 非结构化数据:先有数据,再有结构,
- 结构化数据:先有结构、再有数据
不同类型的数据,我需要采用不同的方式来处理。
- 非结构化的数据处理
文本、电话号码、邮箱地址
用:正则表达式
html文件
用:正则表达式 / xpath/css选择器/bs4
- 结构化的数据处理
json文件
用:jsonPath / 转化成Python类型进行操作(json类)
xml文件
用:转化成Python类型(xmltodict) / XPath / CSS选择器 / 正则表达式
Beautiful Soup 4.2.0 文档
一、简介
官方文档:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
Beautiful Soup是一个HTML / XML的解析器,主要的功能是解析和提取HTML / XML数据。
lxml只会局部遍历,而Beautiful Soup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。
BeautifulSoup用来解析HTML比较简单,API非常人性化,支持CSS选择器,Python标准库中的HTML解析器,也支持lxml的XML解析器。
Beautiful Soup 3目前已经停止开发,推荐现在的项目使用Beautiful Soup 4.使用pip安装即可:
pip install beautifulsoup4
抓取工具 | 速度 | 使用难度 | 安装难度 |
---|---|---|---|
正则 | 最快 | 困难 | 无(内置) |
BeautifulSoup | 慢 | 最简单 | 简单 |
LXML | 快 | 简单 | 一般 |
二、bs4的使用
1、导入模块
#安装 Beautiful Soup
pip install html5lib
#安装解析器
pip install lxml
2、获取节点
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title title1">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<em>hello</em>
<b>The Dormouse's story</b>
<i>haskdjfhakjsf</i>
</p>
<p class="story" id='story'>
<i>
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
</i>
</p>
<p class="story">...</p>
"""
# 用lxml格式解析html 解析器
# soup = BeautifulSoup(html_doc,"lxml")
soup = BeautifulSoup(html_doc,"html5lib")
# print(soup)
# print(type(soup))
# 格式化
# print(soup.prettify())
# 标签选择
print('soup.title 输出:',soup.title)
# 打印第一个
print('soup.p 输出:',soup.p)
# 获取文本内容
#get_text() 获取当前标签下,子孙标签的所有文本
print('soup.i.get_text() 输出:',soup.i.get_text())
# string只能获取当前标签下的文本
print('soup.i.string 输出:',soup.i.string)
print('soup.i.text 输出:',soup.i.text)
# 标签属性
print('soup.title.name 输出:',soup.title.name)
# attrs所有的属性,字典字典{"属性名":[值]}
print('soup.p.attrs 输出:',soup.p.attrs)
# 访问属性
print("soup.p.attrs['class'] 输出:",soup.p.attrs['class'])
# 直接访问属性
print("soup.p['class'] 输出:",soup.p['class'])
# 获取父节点
print("soup.p.parent 输出:",soup.p.parent)
# 获取祖父节点
# print("soup.p.parents 输出:",soup.p.parents)
3、寻找节点
3.1 通过find()来查找
#只找第一个
# find
# name=None, 便签名
#attrs={} ,属性名
# 只找第一个标签
print(soup.find('p'))
# 通过类名来查找节点
print(soup.find('p',attrs={'class':"story"}))
print(soup.find('p',class_="story"))
# 通过id来查找节点
print(soup.find('p',id="story"))
3.2通过find_all()来查找
#查找全部
# find_all
'''
参数:name=None, attrs={}, recursive=True,
text=None,limit=None, **kwargs
'''
# 查找所有符合的标签,返回一个列表
print(soup.find_all('p'))
# 限制输出
print(soup.find_all('a',limit=2))
# 使用正则
print(soup.find_all(re.compile('^p')))
print(soup.find_all(text=re.compile("^L")))
3.3 通过select()来查找
# css选择器
# 查找id为story下的a(子孙节点)
print(soup.select("#story a"))
# 查找id为story下的子节点下的a(子节点)
print(soup.select("#story > i > a"))
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~
pytho爬虫使用bs4 解析页面和提取数据的更多相关文章
- python爬虫使用xpath解析页面和提取数据
XPath解析页面和提取数据 一.简介 关注公众号"轻松学编程"了解更多. XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.X ...
- python简单爬虫 用lxml解析页面中的表格
目标:爬取湖南大学2018年在各省的录取分数线,存储在txt文件中 部分表格如图: 部分html代码: <table cellspacing="0" cellpadding= ...
- scrapy框架Selector提取数据
从页面中提取数据的核心技术是HTTP文本解析,在python中常用的模块处理: BeautifulSoup 非常流行的解析库,API简单,但解析的速度慢. lxml 是一套使用c语言编写的xml解析 ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)
一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...
- Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- MiseringThread.java 解析页面线程
MiseringThread.java 解析页面线程 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner; imp ...
- bs4解析库
beautifulsoup4 bs4解析库是灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便地实现网页的提取 要解析的html标签 from bs4 import B ...
- Python3编写网络爬虫06-基本解析库Beautiful Soup的使用
二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...
随机推荐
- Tomcat 8.5中获取客户端真实IP及协议
获取客户端真实IP ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返 ...
- 【学习笔记/题解】分层图/[JLOI2011]飞行路线
题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...
- Linux为STDOUT的关键字设置颜色
echo "颜色测试aaa实测" | perl -pe 's/(aaa|实|测)/\e[1;31m$1\e[0m/g'
- MySQL 之 innodb 日志管理 -- 1. 基本日志文件
1.基本日志文件分类 错误日志(error log) 慢查询日志日志(slow query log) 二进制日志(binlog) 查询日志(general log) 2.错误日志 主要包括mysql的 ...
- 下载 node.js 步骤 bower npm 报错解决
1,下载node.js ,安装之后就可以 了 2,解决"npm不是内部或外部命令" ,打开安装的node.js 的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...
- dockerfile构建Tomcat镜像
dockerfile构建Tomcat镜像 一.镜像分层概念 二.制作tomcat镜像 2.1.创建分层目录 [root@node2 ~]# mkdir /app/{web/{nginx,tomcat, ...
- Python日志采集(详细)
通常在前期调试代码的时候,我们会使用print在IDE控制台打印一些信息,判断运行情况.但在运行整个自动化测试项目的过程中,通过print打印信息的方式获取运行情况显然行不通. 这时就需要收集日志,每 ...
- day63 Pyhton 框架Django 06
内容回顾 1.装饰器 装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能. def wrapper(func): def inner(*args,**kwargs): # ...
- github 上传与删除项目
在github上创建好仓库后,在本地创建一个仓库 1.先要初始化本地仓库 git config --global user.name 'you name' git config --global us ...
- 【UER #1】DZY Loves Graph
UOJ小清新题表 题目内容 UOJ链接 DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况: Add a b: ...