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+Django在windows下的开发环境配置图解
Nov 11 Python
Python语言生成水仙花数代码示例
Dec 18 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
python中对数据进行各种排序的方法
Jul 02 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
Python @property装饰器原理解析
Jan 22 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
Python configparser模块封装及构造配置文件
Aug 07 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
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
javascript高亮效果的二种实现方法
2008/09/14 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
青春励志演讲稿
2014/04/29 职场文书
2014年路政工作总结
2014/12/10 职场文书
怎样写离婚协议书
2015/01/26 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
小学班主任心得体会
2016/01/07 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
python 对图片进行简单的处理
2021/06/23 Python
Python函数式编程中itertools模块详解
2021/09/15 Python