页面解析和数据提取

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

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

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

  • 非结构化的数据处理
  1. 文本、电话号码、邮箱地址
  2. 用:正则表达式
  3. html文件
  4. 用:正则表达式 / xpath/css选择器/bs4
  • 结构化的数据处理
  1. json文件
  2. 用:jsonPath / 转化成Python类型进行操作(json类)
  3. xml文件
  4. 用:转化成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、导入模块
  1. #安装 Beautiful Soup
  2. pip install html5lib
  3. #安装解析器
  4. pip install lxml
2、获取节点
  1. from bs4 import BeautifulSoup
  2. html_doc = """
  3. <html><head><title>The Dormouse's story</title></head>
  4. <body>
  5. <p class="title title1">
  6. <ul>
  7. <li>1</li>
  8. <li>2</li>
  9. <li>3</li>
  10. </ul>
  11. <em>hello</em>
  12. <b>The Dormouse's story</b>
  13. <i>haskdjfhakjsf</i>
  14. </p>
  15. <p class="story" id='story'>
  16. <i>
  17. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
  18. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
  19. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
  20. </i>
  21. </p>
  22. <p class="story">...</p>
  23. """
  24. # 用lxml格式解析html 解析器
  25. # soup = BeautifulSoup(html_doc,"lxml")
  26. soup = BeautifulSoup(html_doc,"html5lib")
  27. # print(soup)
  28. # print(type(soup))
  29. # 格式化
  30. # print(soup.prettify())
  31. # 标签选择
  32. print('soup.title 输出:',soup.title)
  33. # 打印第一个
  34. print('soup.p 输出:',soup.p)
  35. # 获取文本内容
  36. #get_text() 获取当前标签下,子孙标签的所有文本
  37. print('soup.i.get_text() 输出:',soup.i.get_text())
  38. # string只能获取当前标签下的文本
  39. print('soup.i.string 输出:',soup.i.string)
  40. print('soup.i.text 输出:',soup.i.text)
  41. # 标签属性
  42. print('soup.title.name 输出:',soup.title.name)
  43. # attrs所有的属性,字典字典{"属性名":[值]}
  44. print('soup.p.attrs 输出:',soup.p.attrs)
  45. # 访问属性
  46. print("soup.p.attrs['class'] 输出:",soup.p.attrs['class'])
  47. # 直接访问属性
  48. print("soup.p['class'] 输出:",soup.p['class'])
  49. # 获取父节点
  50. print("soup.p.parent 输出:",soup.p.parent)
  51. # 获取祖父节点
  52. # print("soup.p.parents 输出:",soup.p.parents)
3、寻找节点
3.1 通过find()来查找
  1. #只找第一个
  2. # find
  3. # name=None, 便签名
  4. #attrs={} ,属性名
  5. # 只找第一个标签
  6. print(soup.find('p'))
  7. # 通过类名来查找节点
  8. print(soup.find('p',attrs={'class':"story"}))
  9. print(soup.find('p',class_="story"))
  10. # 通过id来查找节点
  11. print(soup.find('p',id="story"))
3.2通过find_all()来查找
  1. #查找全部
  2. # find_all
  3. '''
  4. 参数:name=None, attrs={}, recursive=True,
  5. text=None,limit=None, **kwargs
  6. '''
  7. # 查找所有符合的标签,返回一个列表
  8. print(soup.find_all('p'))
  9. # 限制输出
  10. print(soup.find_all('a',limit=2))
  11. # 使用正则
  12. print(soup.find_all(re.compile('^p')))
  13. print(soup.find_all(text=re.compile("^L")))
3.3 通过select()来查找
  1. # css选择器
  2. # 查找id为story下的a(子孙节点)
  3. print(soup.select("#story a"))
  4. # 查找id为story下的子节点下的a(子节点)
  5. 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. GOOGLE工作法(世界一速)|木深读书笔记

  2. kail使用sunJDK

    今天在安装软件的时候报错,提示应使用oracle的JDK,所以鼓捣了一会发现个简单的方法 1.下载安装包解压文件到opttar -xzvf jdk-8u91-linux-x64.tar.gz 2.设置 ...

  3. 【随笔】Apache降权和禁用PHP危险函数

    测试环境: Windows Server 2003 + phpstudy 首先在win2003里运行phpstudy,这里注意需要选择应用系统服务模式,应用之后重启phpstudy. 打开系统服务(开 ...

  4. JavaScript reduce()的使用

    语法 arr.reduce(callback(accumulator, currentValue, index, array), initialValue) 参数 callback 执行数组中每个值 ...

  5. Flutter 1.22 正式发布

    支持iOS 14和Android 11,新的i18n和l10n支持,可用于生产的Google Maps和WebView插件,新的App Size工具等等! 作者:Chris Sells 原文:http ...

  6. JVM内存布局(又叫Java运行时数据区)

    JVM 堆中的数据是共享的,是占用内存最大的一块区域. 可以执行字节码的模块叫作执行引擎. 执行引擎在线程切换时怎么恢复?依靠的就是程序计数器. JVM 的内存划分与多线程是息息相关的.像我们程序中运 ...

  7. WSL2 bug

    错误现象 Stdout: Stderr: 2020/05/27 20:01:37 resolving /mnt/host/c/Program Files/Docker/Docker/resources ...

  8. 用python处理excel文件有多轻松?工作从未如此简单

    最近需要频繁读写 excel 文件,想通过程序对 excel 文件进行自动化处理,发现使用 python 的 openpyxl 库进行 excel 文件读写实在太方便了,结构清晰,操作简单.本文对 o ...

  9. 小白安装使用Redis

    Redis属于NoSql中的键值数据库,非常适合海量数据读写. 之前用过mongo但是没有用过redis,今天来学习安装redis. 先去官网下载redis安装包 redis官网 redis是c语言编 ...

  10. js 正则表达式 判断val是不是整数

    function isIntNum(val){ var regPos = / ^\d+$/; // 非负整数 // var regNeg = /^\-[1-9][0-9]*$/; // 负整数 if( ...