页面解析和数据提取

关注公众号“轻松学编程”了解更多。
一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为两部分,非结构化的数据 和 结构化的数据。

  • 非结构化数据:先有数据,再有结构,
  • 结构化数据:先有结构、再有数据

不同类型的数据,我需要采用不同的方式来处理。

  • 非结构化的数据处理
文本、电话号码、邮箱地址
用:正则表达式
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 解析页面和提取数据的更多相关文章

  1. python爬虫使用xpath解析页面和提取数据

    XPath解析页面和提取数据 一.简介 关注公众号"轻松学编程"了解更多. XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.X ...

  2. python简单爬虫 用lxml解析页面中的表格

    目标:爬取湖南大学2018年在各省的录取分数线,存储在txt文件中 部分表格如图: 部分html代码: <table cellspacing="0" cellpadding= ...

  3. scrapy框架Selector提取数据

    从页面中提取数据的核心技术是HTTP文本解析,在python中常用的模块处理: BeautifulSoup  非常流行的解析库,API简单,但解析的速度慢. lxml 是一套使用c语言编写的xml解析 ...

  4. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  5. 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)

    一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...

  6. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  7. MiseringThread.java 解析页面线程

    MiseringThread.java 解析页面线程 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner; imp ...

  8. bs4解析库

    beautifulsoup4 bs4解析库是灵活又方便的网页解析库,处理高效,支持多种解析器.利用它不用编写正则表达式即可方便地实现网页的提取 要解析的html标签 from bs4 import B ...

  9. Python3编写网络爬虫06-基本解析库Beautiful Soup的使用

    二.Beautiful Soup 简介 就是python的一个HTML或XML的解析库 可以用它来很方便的从网页中提取数据 0.1 提供一些简单的 python式的函数来处理导航,搜索,修改分析树等功 ...

随机推荐

  1. Tomcat 8.5中获取客户端真实IP及协议

    获取客户端真实IP ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返 ...

  2. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...

  3. Linux为STDOUT的关键字设置颜色

    echo "颜色测试aaa实测" | perl -pe 's/(aaa|实|测)/\e[1;31m$1\e[0m/g'

  4. MySQL 之 innodb 日志管理 -- 1. 基本日志文件

    1.基本日志文件分类 错误日志(error log) 慢查询日志日志(slow query log) 二进制日志(binlog) 查询日志(general log) 2.错误日志 主要包括mysql的 ...

  5. 下载 node.js 步骤 bower npm 报错解决

    1,下载node.js  ,安装之后就可以 了 2,解决"npm不是内部或外部命令"   ,打开安装的node.js  的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...

  6. dockerfile构建Tomcat镜像

    dockerfile构建Tomcat镜像 一.镜像分层概念 二.制作tomcat镜像 2.1.创建分层目录 [root@node2 ~]# mkdir /app/{web/{nginx,tomcat, ...

  7. Python日志采集(详细)

    通常在前期调试代码的时候,我们会使用print在IDE控制台打印一些信息,判断运行情况.但在运行整个自动化测试项目的过程中,通过print打印信息的方式获取运行情况显然行不通. 这时就需要收集日志,每 ...

  8. day63 Pyhton 框架Django 06

    内容回顾 1.装饰器 装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能. def wrapper(func): def inner(*args,**kwargs): # ...

  9. github 上传与删除项目

    在github上创建好仓库后,在本地创建一个仓库 1.先要初始化本地仓库 git config --global user.name 'you name' git config --global us ...

  10. 【UER #1】DZY Loves Graph

    UOJ小清新题表 题目内容 UOJ链接 DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况: Add a b: ...