前面解析了正则表达式,其实内容还挺多的对吧?确实挺适用的,不仅是python,其他语言或者web前端后端基本都要掌握正则表达式知识,但是你说,这么多,要完全的掌握,灵活运用的话,得搞多久啊?并且如果一次匹配稍有差池,一步错,步步错,并且很多朋友相信其实还不太熟练正则表达式,咋办呢?有没有什么可以替代正则表达式呢?哎,有的,那就是——BeautifulSoup。

BeautifulSoup

1.简介

官方文档的解释是:

“Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。”

通俗的说就是,BeautifulSoup模块是第三方模块(所以你需要事先用pip或者easy_install或者在pypi社区下载压缩包安装),它一样可以抓取html标签的代码,而且比正则表达式更适用简单

要说一下的是,Beautiful Soup3目前已经停止开发,推荐使用Beautiful Soup4,不过它已经被移植到bs4了,也就是说导入时我们需要 import bs4 。另外据说 BS4 对Python3的支持不够好,如果你是在要在python3中使用,可以考虑下载 BS3 版本。

注意,安装时,命令是:easy_install beautifulsoup4/pip install beautifulsoup4,使用的是小写

这里有篇beautifulsoup的官方文档,如果你觉得我的博文不适合你可以看看官方的:传送门

2.从例子中学习知识点:

好的,这里用我之前写的一个非常简单的html标签测试:

<html>
	<head>
	<title>这是第二节课</title>
	<meta charset='utf-8'> <!--meta是单标签-->
	<meta name='keywords' content='hello world,oh yeah'>
	</head>
	<!--<body bgcolor='green'>-->
	<body link='red' vinlk='green' alink='blue'>
		<h1>这是一个标题</h1>
		<!--超链接必须加上http://不然无法跳转-->
		<a href='http://www.baidu.com'>百度</a>
		<a href='http://www.163.com'>网易</a>
		<a href='http://www.qq.com'>腾讯</a>
		<a href='http://www.sina.com'>新浪</a>
	</body>
</html>

上面的head,title,meta cahrset,h1,a等等的就是Tag标签,那么我们怎么把数据拿到呢?

前提我们要创建一个BeautifulSoup对象:

import bs4
test=bs4.BeautifulSoup(html)

这里补充一下,你也可以在创建一个BeautifulSoup对象的同时打开本地文件,比如:

test1=bs4.BeautifulSoup(open(test.html))

不过,打开了一个文件,记得最后手动关闭

完整代码:

# -*- coding:utf-8 -*-
import bs4
html='''
<html>
	<head>
	<title>这是第二节课</title>
	<meta charset='utf-8'> <!--meta是单标签-->
	<meta name='keywords' content='hello world,oh yeah'>
	</head>
	<!--<body bgcolor='green'>-->
	<body link='red' vinlk='green' alink='blue'>

		<h1>这是一个标题</h1>
		<!--超链接必须加上http://不然无法跳转-->
		<a href='http://www.baidu.com'>百度</a>
		<a href='http://www.163.com'>网易</a>
		<a href='http://www.qq.com'>腾讯</a>
		<a href='http://www.sina.com'>新浪</a>

	</body>
</html>
'''
test=bs4.BeautifulSoup(html)
print test.title

结果测试:

妥妥的就把title标签以及标签里的数据单独取出来了,但是出现一些东西,大概意思是没有给解析器吧,所以有一个警告,并不是报错,由于我是用的pycharm,可能不会默认使用解析器(解析器问题见下面),所以,加上python自带的解析器就没问题了

好的,通过用Tag标签就可以轻松的取出html标签里我们想要取的数据,这里来看,是不是觉得比正则表达式简单多了?但有一点是,它默认查找的是在所有内容中的第一个符合要求的标签(可以修改),和正则里的search和match方法类同对吧?

那这对象到底是什么类型呢?

Tag

通俗点说,Tag就是HTML中的一个个标签。Tag有两个重要的属性:name,attrs

name:

创建出来的test对象本身的name即为[document],对于其他内部标签,输出的值便为标签本身的名称

attrs:

前面的html标签里是这样的:

<body link='red' vinlk='green' alink='blue'>

看出来了吧?attrs就是打印body的属性,结果得到一个字典,而且我们还可以通过键得到值,还可以使用字典方法get,也可以修改键值:

既然都是字典,相关的字典方法也都可以使用,自己发现了,这里略过

那有朋友说了,既然我们已经可以利用标签得到想要的数据,那么我们只要数据,而不要标签呢?

利用string方法

这样是不是很完美的又很轻易的把html标签里的数据轻松取出来来了呢?

那这种又是什么类型 呢?

NavigableString

好的,它就是BeautifulSoup的NavigableString对象

NavigableString

翻译过来叫可以遍历的字符串,其实我们之前学习的字符串本来就可遍历对不对,所以它就是一个字符串,所以支持字符串相关的所有属性和方法,你可以随意处理,和前面得到的字典一样,这里就直接略过了

那有朋友说,假如html标签里恰好只是一个注释符呢?比如像这样:<h1><!--this is the test--></h1>,这种能不能得到数据,并且又是什么类型呢?

能得到数据对不对,并且默认把注释符省略了,那这个Comment对象又是什么呢?

Comment

Comment对象是一个特殊类型的NavigableString对象,其实输出的内容并不包括注释符号。

那假如我们在开发中,并不需要得到是注释符的数据呢?很简单啊,用if条件判断啊,看是否是Comment对象,是的话就pass咯。

 

这四个对象每个都有自己的方法和属性,你可以理解为如同是urllib.urlopen创建的对象

说了这么多,BeautifulSoup模块还没解析呢,是的,上面说到的,你如果学会了,那么获取html标签数据已经没问题了对吧?那么你说,我就是还想知道BeautifulSoup模块还有哪些功能对吧?好的,接着看:

3.BeautifulSoup模块方法/属性

注意看,我在python2上装了个BeautifulSoup和beautifulsoup,方法有点差别。按理说前者也可以使用的,不过既然有新版,那么我就用bs4来解析了。

要补充的是,bs4需要一个解析网页代码的工具,有lxml,有html5lib,html.parser(python自带)。所以还需要安装其中一个,那他们有什么区别呢?

解析器

使用方法

优势

劣势

Python标准库

BeautifulSoup(markup, “html.parser”)

Python的内置标准库

执行速度适中

文档容错能力强

Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差

lxml HTML 解析器

BeautifulSoup(markup, “lxml”)

速度快

文档容错能力强

需要安装C语言库

lxml XML 解析器

BeautifulSoup(markup, [“lxml”, “xml”])BeautifulSoup(markup, “xml”)

速度快

唯一支持XML的解析器

需要安装C语言库

html5lib 解析器

BeautifulSoup(markup, “html5lib”)

最好的容错性

以浏览器的方式解析文档,解析方式与浏览器相同

生成HTML5格式的文档

速度慢

不依赖外部扩展

如果我们不安装解析器,则 Python 会使用 Python默认的解析器,lxml 解析器速度快,功能强大,推荐安装

4.常用方法/属性

假设我们需要获取到百度首页源代码的某一部分的内容:

html='''
<div class="qrcodeCon">
	<div id="qrcode">
		<div class="qrcode-item qrcode-item-1">
			<div class="qrcode-img"></div>
			<div class="qrcode-text">
					<p><b>手机百度</b></p>
			</div>
		</div>
	</div>
</div>
<div id="ftCon">

<div class="ftCon-Wrapper"><div id="ftConw"><p id="lh"><a id="setf" href="//www.baidu.com/cache/sethelp/help.html" onmousedown="return ns_c({'fm':'behs','tab':'favorites','pos':0})" target="_blank">把百度设为主页</a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about'})" href="http://home.baidu.com">关于百度</a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about_en'})" href="http://ir.baidu.com">About  Baidu</a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_tuiguang'})" href="http://e.baidu.com/?refer=888">百度推广</a></p><p id="cp">©2017 Baidu <a href="http://www.baidu.com/duty/" onmousedown="return ns_c({'fm':'behs','tab':'tj_duty'})">使用百度前必读</a> <a href="http://jianyi.baidu.com/" class="cp-feedback" onmousedown="return ns_c({'fm':'behs','tab':'tj_homefb'})">意见反馈</a> 京ICP证030173号 <i class="c-icon-icrlogo"></i> <a id="jgwab"  target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001">京公网安备11000002000001号</a> <i class="c-icon-jgwablogo"></i></p></div></div></div>
        <div id="wrapper_wrapper">
        </div>
    </div>
    <div class="c-tips-container" id="c-tips-container"></div>

    <script>
        window.__async_strategy=2;
        //window.__switch_add_mask=false;
    </script>

<script>
'''

好的,我们先看看生成的BeautifulSoup对象有什么方法属性:

和刚才的bs4模块方法对比好多啊,对了,这个BeautifulSoup对象里的方法才是本篇博文的重点

prettify():作格式化输出待处理文本对象(你可以理解为类同前面的print  urllib.urlopen('test.html').read())

5.Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

BeautifulSoup

Tag

NavigableString

Comment

(以上四个对象相关特性上面已经解析,略过)

那么还有的功能呢?不急,本篇暂且到此,下一篇继续

洗礼灵魂,修炼python(65)--爬虫篇—BeautifulSoup:“忘掉正则表达式吧,我拉车养你”的更多相关文章

  1. 洗礼灵魂,修炼python(63)--爬虫篇—re模块/正则表达式(1)

    爬虫篇前面的某一章了,我们要爬取网站页面源代码的数据,要从中获取到我们想要的数据,是不是感觉很费力,确实费力对吧?那么有没有什么有利的工具来解决这个问题呢?那就是这一篇博文的主题—— 正则表达式简介 ...

  2. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  3. 洗礼灵魂,修炼python(64)--爬虫篇—re模块/正则表达式(2)

    前面学习了元家军以及其他的字符匹配方法,那得会用啊对吧?本篇博文就简单的解析怎么运用 正则表达式使用 前面说了正则表达式的知识点,本篇博文就是针对常用的正则表达式进行举例解析.相信你知道要用正则表达式 ...

  4. Python网络爬虫之BeautifulSoup模块

    一.介绍: Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮 ...

  5. Python学习——爬虫篇

    requests 使用requests进行爬取                 下面是我编写的第一个爬虫的脚本                   import requests # 导入reques ...

  6. python简单爬虫 用beautifulsoup爬取百度百科词条

    目标:爬取“湖南大学”百科词条并处理数据 需要获取的数据: 源代码: <div class="basic-info cmn-clearfix"> <dl clas ...

  7. Python学习—爬虫篇之破解ntml登陆问题

    之前帮公司爬取过内部的一个问题单网站,要求将每个问题单的下的附件下载下来.一开始的时候我就遇到一个破解登陆验证的大坑......      (╬ ̄皿 ̄)=○ 由于在公司使用的都是内网,代码和网站的描述 ...

  8. 初识python 之 爬虫:BeautifulSoup 的 find、find_all、select 方法

    from bs4 import BeautifulSoup lxml 以lxml形式解析html,例:BeautifulSoup(html,'lxml') #  注:html5lib 容错率最高fin ...

  9. Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码

    通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...

随机推荐

  1. 遇到的一些Jquery,js函数

     jQuery.extend()        jQuery.merge():函数用于合并两个数组内容到第一个数组. <script> $(function () { ,,], [,,] ...

  2. centos 7 linux 安装与卸载 jdk 7

    一.声明 本文采用操作系统版本: Centos 7 Linux 系统 版本源:CentOS-7-x86_64-DVD-1708.iso 官网下载地址:http://isoredirect.centos ...

  3. PHP中的__set和__get方法

    当调用或者设置类不存在的方法时,_会调用_set和__get方法 以下是示例 <?php class HandsonBoy { private $name = 'chenqionghe'; pr ...

  4. htmlUnit加持,网络小蜘蛛的超级进化

    前言 前段时间写了个小说线上采集阅读(猛戳这里:https://www.cnblogs.com/huanzi-qch/p/9817831.html),当我们去采集起点网的小说目录时发现目录数据没有在h ...

  5. Linux命令-用户及权限管理

    一.权限管理linux系统中对文件权限的描述机制: u g od r w x r w x r - x (r读,w写,x执行)文件 所有者 所属组 其他人可以表示为二进制: 111 111 101也可以 ...

  6. linux内核源码目录结构分析

    原文地址 /arch.arch是architecture的缩写.arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在a ...

  7. 业务开发(一)—— MySQL

    0x01.SQL异常Incorrect string value java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9 ...

  8. [转]c# System.IO.Ports SerialPort Class

    本文转自:https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport?redirectedfrom=MSDN& ...

  9. oracle表空间大小的限制和DB_BLOCK_SIZE的概念

    之前接触的项目表空间最大也不超过10G,所以导入数据库时一直使用导入本地的oracle数据库文件的方法,即根据dmp文件大小设置一个数据文件,设定表空间最大值. --创建表空间,数据文件为'F:\ap ...

  10. log4.net 自定义日志文件名称

    插件化项目中,遇到这样一个需求,每个插件 或者每个方法 一个日志文件,方便后期错误排查 源码地址: https://github.com/xlb378917466/SharpHttpServerCas ...