您的位置:首页 > 编程语言 > Python开发

Python网页抓取工具Beautiful Soup面面观!

2017-11-28 13:38 351 查看
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。提供一些简单的、python式的函数,用来处理导航、搜索、修改分析树等功能。

Beautiful Soup是一个工具箱,通过解析文档为用户提供需要抓取的数据。因为简单,所以不需要多少代码,就可以写出一个完整的应用程序。

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

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

Beautiful Soup 安装

Beautiful Soup 3 目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时需要import bs4 。如果你用的是新版的Debain或Ubuntu,那么可以通过系统的软件包管理来安装。

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器。如果不安装它,则Python 会使用Python默认的解析器

创建Beautiful Soup 对象

首先必须要导入bs4 库

from bs4 import BeautifulSoup

先创建一个字符串供使用

html = """

<html><head><title>The Dormouse's story</title></head>

<body>

<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were

<a href="http://example.com/elsie" class="sister" id="link1"><!--Elsie --></a>,

<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and

<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;

and they lived at the bottom of a well.</p>

<p class="story">...</p>

"""

创建beautifulsoup对象

soup = BeautifulSoup(open('index.html'))

另外,还可以用本地HTML 文件来创建对象,例如

print soup.prettify()

上面这句代码,便是将本地index.html 文件打开,用它来创建soup 对象

下面来打印一下soup 对象的内容,格式化输出

print soup.prettify()

Beautiful Soup对象种类

Beautiful Soup将复杂HTML文档,转换成一个复杂的树形结构。

每个节点都是Python对象,所有对象可以归纳为4种:

(1)Tag

Tag 其实就是HTML 中的一个个标签

例如

<title>The Dormouse's story</title>

<aclass="sister" href="http://example.com/elsie" id="link1">Elsie</a>

上面的title 、a 等等HTML 标签加上里面包括的内容就是Tag,用Beautiful Soup 来获取Tags

print soup.title

print soup.head

print soup.a

print soup.p

print type(soup.a)

print soup.name

print soup.head.name

(2)NavigableString

如果已经得到了标签的内容,要想获取标签内部的文字怎么办?

用.string 获取内部文字

print soup.p.string

它的类型是一个NavigableString,其意思是可以遍历的字符串。

(3)BeautifulSoup

BeautifulSoup对象,表示的是一个文档的全部内容

很多时候可以把它当作一个特殊的Tag 对象

可以分别获取它的类型,名称,以及属性

print type(soup.name)

print soup.name

print soup.attrs

(4)Comment

Comment对象是一特殊类型NavigableString对象,输出的内容仍不包括注释符号

如果它处理不好,可能会对文本处理造成意想不到的麻烦。

找一个带注释的标签

print soup.a

print soup.a.string

print type(soup.a.string)

<a class="sister"href="http://example.com/elsie"id="link1"><!--Elsie--></a>

Elsie

<class'bs4.element.Comment'>

a 标签里的内容实际上是注释,但是如果用.string 来输出它的内容,会发现它已经把注释符号去掉了,所以这可能会给带来不必要的麻烦。

另外打印输出它的类型,发现它是一个Comment 类型,在使用前最好做一下判断

iftype(soup.a.string)==bs4.element.Comment:

print soup.a.string
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python ubuntu html 对象 utf-8