python BeautifulSoup使用方法详解


Posted in Python onNovember 21, 2013

直接看例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><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="https://3water.com" class="sister" id="link1">Elsie</a>,
<a href="https://3water.com" class="sister" id="link2">Lacie</a> and
<a href="https://3water.com" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc)
print soup.title
print soup.title.name
print soup.title.string
print soup.p
print soup.a
print soup.find_all('a')
print soup.find(id='link3')
print soup.get_text()

结果为:

<title>The Dormouse's story</title>
title
The Dormouse's story
<p class="title"><b>The Dormouse's story</b></p>
<a class="sister" href="https://3water.com" id="link1">Elsie</a>
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
<a class="sister" href="https://3water.com" id="link3">Tillie</a>
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...

可以看出:soup 就是BeautifulSoup处理格式化后的字符串,soup.title 得到的是title标签,soup.p  得到的是文档中的第一个p标签,要想得到所有标签,得用find_all
函数。find_all 函数返回的是一个序列,可以对它进行循环,依次得到想到的东西.
get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。你可以试试 print soup.p.get_text()
其实是可以获得标签的其他属性的,比如我要获得a标签的href属性的值,可以使用 print soup.a['href'],类似的其他属性,比如class也是可以这么得到的(soup.a['class'])。
特别的,一些特殊的标签,比如head标签,是可以通过soup.head 得到,其实前面也已经说了。
如何获得标签的内容数组?使用contents 属性就可以 比如使用 print soup.head.contents,就获得了head下的所有子孩子,以列表的形式返回结果,
可以使用 [num]  的形式获得 ,获得标签,使用.name 就可以。
获取标签的孩子,也可以使用children,但是不能print soup.head.children 没有返回列表,返回的是 <listiterator object at 0x108e6d150>,
不过使用list可以将其转化为列表。当然可以使用for 语句遍历里面的孩子。
关于string属性,如果超过一个标签的话,那么就会返回None,否则就返回具体的字符串print soup.title.string 就返回了 The Dormouse's story
超过一个标签的话,可以试用strings
向上查找可以用parent函数,如果查找所有的,那么可以使用parents函数
查找下一个兄弟使用next_sibling,查找上一个兄弟节点使用previous_sibling,如果是查找所有的,那么在对应的函数后面加s就可以

如何遍历树?

使用find_all 函数

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

举例说明:

print soup.find_all('title')
print soup.find_all('p','title')
print soup.find_all('a')
print soup.find_all(id="link2")
print soup.find_all(id=True)

返回值为:

[<title>The Dormouse's story</title>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<a class="sister" href="https://3water.com" id="link2">Lacie</a>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]

通过css查找,直接上例子:

print soup.find_all("a", class_="sister")
print soup.select("p.title")

通过属性进行查找

print soup.find_all("a", attrs={"class": "sister"})

通过文本进行查找

print soup.find_all(text="Elsie")
print soup.find_all(text=["Tillie", "Elsie", "Lacie"])

限制结果个数

print soup.find_all("a", limit=2)

结果为:

[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[<p class="title"><b>The Dormouse's story</b></p>]
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>, <a class="sister" href="https://3water.com" id="link3">Tillie</a>]
[u'Elsie']
[u'Elsie', u'Lacie', u'Tillie']
[<a class="sister" href="https://3water.com" id="link1">Elsie</a>, <a class="sister" href="https://3water.com" id="link2">Lacie</a>]

总之,通过这些函数可以查找到想要的东西。

Python 相关文章推荐
python的urllib模块显示下载进度示例
Jan 17 Python
python中defaultdict的用法详解
Jun 07 Python
python读写LMDB文件的方法
Jul 02 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
python顺序执行多个py文件的方法
Jun 29 Python
python实现大文本文件分割
Jul 22 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
python对Excel的读取的示例代码
Feb 14 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
Python入门之基础语法详解
May 11 Python
python装饰器使用方法实例
Nov 21 #Python
tornado框架blog模块分析与使用
Nov 21 #Python
python迭代器的使用方法实例
Nov 21 #Python
python生成器的使用方法
Nov 21 #Python
python单链表实现代码实例
Nov 21 #Python
python双向链表实现实例代码
Nov 21 #Python
python二叉树遍历的实现方法
Nov 21 #Python
You might like
用php+mysql一个名片库程序
2006/10/09 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
JavaScript中的函数嵌套使用
2015/06/04 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
python中global与nonlocal比较
2014/11/21 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
华为慧通笔试题
2016/04/22 面试题
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
招聘专员岗位职责
2014/03/07 职场文书
健康教育评估方案
2014/05/25 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
交通事故协议书范本
2014/11/18 职场文书
公司2014年度工作总结
2014/12/10 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书