1、安装bs4

我用的ubuntu14.4,直接用apt-get命令就行

sudo apt-get install Python-bs4

2、安装解析器

Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是lxml。

sudo apt-get install Python-lxml

3、如何使用

将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象,可以传入一段字符串或一个文件句柄。

from bs4 import BeautifulSoup

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

soup = BeautifulSoup("<html>data</html>")

4、对象的种类

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

tag

Tag对象与XML或HMTL原生文档中的tag相同:

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>

每个tag都有自己的名字,通过.name来获取:

tag.name
# u'b'

一个tag可能有很多属性。

tag['class']
# u'boldest'
tag.attrs
# {u'class': u'boldest'}

NavigableString

字符串常被包含在tag内。

tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>

BeautifulSoup

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

soup
<html><body><b class="boldest">Extremely bold</b></body></html>
type(soup)
<class 'bs4.BeautifulSoup'>

Comment

一般表示的是文档的注释部分。

5、遍历文档树

tag的名字

可以通过点取属性的方式获取tag,并且可以多次调用。

soup.head
# <head><title>The Dormouse's story</title></head> soup.title
# <title>The Dormouse's story</title>

通过点取属性的方式只能获取当前名字的第一个tag:

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

如果想获取所有的a标签

soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

6、搜索文档树

Beautiful Soup最重要的搜索方法有两个:find(),find_all()。

过滤器

最简单的过滤器是字符串

soup.find_all('b')
# [<b>The Dormouse's story</b>]

通过传入正则表达式来作为参数

import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
# body
# b

传入列表参数

soup.find_all(["a", "b"])
# [<b>The Dormouse's story</b>,
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

如果没有合适的过滤器,还可以自定义方法

find_all()

find_all( name , attrs , recursive , text , **kwargs )

name参数

name参数可以查找所有名字为name的tag,比如title\head\body\p等等

keyword参数

如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.

soup.find_all(id='link2')
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性:

soup.find_all(href=re.compile("elsie"))
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

搜索指定名字的属性时可以使用的参数值包括 字符串 , 正则表达式 , 列表, True .

下面的例子在文档树中查找所有包含 id 属性的tag,无论 id 的值是什么:

soup.find_all(id=True)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

使用多个指定名字的参数可以同时过滤tag的多个属性:

soup.find_all(href=re.compile("elsie"), id='link1')
# [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]

按css搜索

class由于与Python关键字冲突,因此在beatifulsoup中为class_

class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True

text参数

text参数可以搜索文档中的字符串内容。与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True。

像调用 find_all() 一样调用tag

find_all() 几乎是Beautiful Soup中最常用的搜索方法,所以我们定义了它的简写方法. BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:

soup.find_all("a")
soup("a")

这两行代码也是等价的:

soup.title.find_all(text=True)
soup.title(text=True)

CSS选择器

Beautiful Soup支持大部分的CSS选择器 [6] ,在 TagBeautifulSoup 对象的 .select() 方法中传入字符串参数,即可使用CSS选择器的语法找到tag:

soup.select("title")
# [<title>The Dormouse's story</title>] soup.select("p nth-of-type(3)")
# [<p class="story">...</p>]

通过tag标签逐层查找:

soup.select("body a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("html head title")
# [<title>The Dormouse's story</title>]

找到某个tag标签下的直接子标签 [6] :

soup.select("head > title")
# [<title>The Dormouse's story</title>] soup.select("p > a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("p > a:nth-of-type(2)")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] soup.select("p > #link1")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select("body > a")
# []

找到兄弟节点标签:

soup.select("#link1 ~ .sister")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("#link1 + .sister")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通过CSS的类名查找:

soup.select(".sister")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select("[class~=sister]")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通过tag的id查找:

soup.select("#link1")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select("a#link2")
# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

通过是否存在某个属性来查找:

soup.select('a[href]')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

通过属性的值来查找:

soup.select('a[href="http://example.com/elsie"]')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.select('a[href^="http://example.com/"]')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select('a[href$="tillie"]')
# [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] soup.select('a[href*=".com/el"]')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

最新文章

  1. struts 标签的使用&lt;转&gt;
  2. Struts2详细教程
  3. Nginx学习笔记(六) 源码分析&amp;启动过程
  4. C# params关键字
  5. MTK机子修复分区信息
  6. user-agent中的mozilla
  7. awk学习
  8. python 模块导入
  9. MFC窗口风格 WS_style/WS_EX_style(超详细)
  10. 流畅python学习笔记:第十七章:并发处理
  11. sharepoint 2013实践
  12. rpm 相关问题
  13. js03-javascript对象
  14. js 金额处理加小数点后两位
  15. 消息中间件系列五:RabbitMQ的使用场景(异步处理、应用解耦)
  16. 500 G JAVA视频网盘分享(JEECG开源社区)
  17. js计算斐波拉切
  18. 使用URLConnection进行访问
  19. ffmpeg hls 点播负载均衡简单实现
  20. 理解windows模型

热门文章

  1. CSS Sprites的概念、原理、适用范围和优缺点
  2. Java的ThreadContext类加载器的实现
  3. CCNA2.0笔记_IP连接排错
  4. 通过ip查看主机名和端口占用情况
  5. linux控制台超时自动注销
  6. eclispe luna 安装subversive和svn connector插件
  7. liunx下安装mysql(未完待更新)
  8. jQery使网页在显示器上居中显示适用于任何分辨率
  9. 认识tornado(四)
  10. CentOS 安装 dotnetcore